Introducere
(PHP - Hypertext Preprocessor)
Limbajul PHP a fost creat in anul 1994 de catre Rasmus Lerdorf, care
incerca sa-si personalizeze propria pagina Web; din acest motiv limbajul
a fost numit initial PHP adica: Personal Home Page (pagina de baza
personala). Ulterior limbajul a fost perfectionat, utilitatea si
caracteristicile sale s-au dezvoltat treptat, ajungand sa aiba semnificatia
Hypertext Preprprocesor (PHP). Preprocesarea consta in aceea ca datele
sunt interpretate(preprocesate) de catre serverul Web inainte ca acesta
sa genereze cod HTML.
PHP este una dintre cele mai interesante tehnologii pentru site-uri si
programare web, imbina caracteristici dintre cele mai complexe cu
simplitatea n utilizare. PHP a devenit un instrument de frunte pentru
dezvoltarea aplicatiilor Web. Spre deosebire de alte instrumente pentru
aplicatii Web, cum este Perl, PHP este un limbaj de programare comod
pentru ncepatori, chiar si pentru cei care nu au mai desfasurat activitati
de programare.
Daca sunteti un cunoscator al limbajului HTML, dar nu aveti experienta
n materie de programare, va puteti pune ntrebarea: care sunt
functionalitatile suplimentare pe care le poate asigura cunoasterea
limbajului PHP? Ca si alte limbaje de scripting pentru Web, PHP va
permite sa furnizati un continut Web dinamic, adica un continut Web
care se modifica automat de la o zi la alta sau chiar de la un minut la
altul. Continutul Web este un element important n sustinerea traficului
unui sit Web; de regula, vizitatorii nu vor mai reveni la o pagina Web care
contine aceleasi informatii ca si cele prezentate la ultima vizita. Pe de
alta parte, siturile Web frecvent actualizate pot atrage cantitati enorme
de trafic.
Mai mult, spre deosebire de limbajele de scripting, precum JavaScript,
PHP ruleaza pe serverul Web, nu n navigatorulul Web. n consecinta, PHP
poate obtine accesul la fisiere, baze de date si alte resurse inaccesibile
programului JavaScript. Acestea constituie bogate surse de continut
dinamic, care atrag vizitatorii. In plus, putem folosi limbajul PHP pentru a
generera cod Java Script.
Secventele de cod PHP pot fi incluse intr-un fisier HTML; ulterior
serverul Web va identifica aceasta secventa de cod , va procesa acesta
secventa de cod generand cod HTML iar la final va inlocui secventa de
cod PHP cu codul HTML.
Printre caracteristicile cele mai importante ale imbajului enumeram:
- simplicitate : acest limbaj este simplu de folosit, fiind accesibil si
ne-programatorilor. Datorita acestui fapt el a devenit cel mai popular
limbaj de script pentru generarea de pagini HTML dinamice.
- usor de folosit : limbajul are o sintaxa asemanatoare limbajului C,
care este foarte popular in randul programatorilor. De aceea
programatorii care au cunostine de C sau Perl vor face foarte rapid
trecerea spre PHP. Pe de alta parte anumite aspecte cum ar fi: declararea
si folosirea variabilelor este mult simplificata in PHP, spre deosebire de
C++ sau alte limbaje de nivel inalt.
- eficienta : specificatiile limbajului includ folositea tehnicilor de
POO (Programare orientata pe obiecte) iar acest lucru contribuie la
marirea productivitatii: un programator PHP poate folosi module scrise
de un alt programator fara sa fie nevoit sa cunoasca detalii specifice de
implementare a codului.
- cross-platform : exista implementari ale limbajului pe mai multe
sisteme de operare, cele mai populare fiind cele de pe sistemele Linux si
Windows. In acest caz daca scriem cod PHP care ruleaza pe un sistem
Linux, ulterior vom putea folosi acest cod pe un server care ruleaza
Windows si viceversa.
- gratis : PHP reprezinta un program Open Source, oricine poate
folosi acest limbaj fara a fi nevoit sa plateasca ceva. De asemenea
utilizatorii au access la sursele PHP (scrise in limbajul C). Site-ul oficial al
limbajului PHP se afla la : [Link] , datorita popularitatii acestui
limbaj exista numeroase site-uri Web care prezinta informatii despre
PHP, exemple de cod, forum de discutii , etc.
Acest curs de initiere in PHP si MySQL este menit a prezenta elemente
introductive de programare si dezvoltare a paginilor web folosind PHP.
Este important sa retineti ca nu reprezinta decat un punct de plecare cu
lectii si tutoriale php introductive. Dezvoltarea Web este o activitate
solicitanta, iar viitorul dezvoltator Web trebuie sa dispuna de multe
abilitati, printre care si pe aceea de programator. Dezvoltatorii Web
ncepatori vor gasi n aceast curs un prim pas util si amical n activitatea
de programare n PHP.
Scrierea scripturilor PHP elementare
Invatati sa creati un script PHP cu cele mai simple instructiuni PHP
Invatati sa documentati si sa executati un script PHP
Un script PHP poate fi foarte simplu sau foarte complex. Totusi, scrierea
chiar si a unui script PHP complex este relativ simpla, necesitand doar un
editor de texte obisnuit. In aceasta lectie veti invata modul de creare si
de executare a programelor PHP, veti invata sa creati scripturi PHP
simple, care afiseaza in navigatorul web un text simplu. De asemenea,
veti invata sa va documentati scripturile, astfel incat dumneavoastra si
alte persoane sa puteti intelege rapid scopul si structura acestora.
Mai intai trebuie sa instalati un server web (Apache) si modulul pt.
limbajul PHP, acestea sunt gratuite, le puteti gasi pe net si instala pe
fiecare, dar pentru incepatori e recomandat un program care le are deja
configurate (si cu MySQL), precum WampServer, sau sa incarcati scriptul
pe un server web unde este instalat PHP.
Daca nu aveti deja instalat PHP, descarcati de aici -> WampServer,
dezarhivati si instalati programul. (cand este pornit, veti observa o
iconita specifica in colltul cu ceasul).
Fisierele .php in care veti scrie scripturile trebuie sa le salvati in
directorul www din "wamp", apoi, ca sa le testati scrieti in browser
adresa[Link]
1. Scrierea scripturilor PHP
Pentru a crea scripturi PHP, majoritatea programatorilor PHP folosesc
un editor de texte obisnuit. Puteti folosi orice editor de texte doriti. Sub
Microsoft Windows puteti utiliza programul Windows Notepad. Daca
preferati, puteti folosi editoare specializate, gen Notepad++. Totusi,
trebuie sa tineti cont sa fie un editor de text ce salveaza fisierele cu
format text obisnuit simplu.
Daca folositi UNIX sau Linux, puteti crea scripturi PHP folosind un
program precum "vi", "emacs" sau "pico".
Programul in sine nu conteaza, atata vreme cat poate crea fisiere text
ASCII.
Nota : - Unele editoare de texte, precum "Notepad++" sau "vi", asigura un suport
special pentru scrierea programelor PHP. De exemplu, au o caracteristica de colorare a
elementelor de sintaxa ce determina scrierea diferitelor elemente ale codului PHP in culori
diferite. Procedeul de colorare a elementelor de sintaxa faciliteaza depistarea erorilor din
programele proprii.
2. Scrierea scheletului programelor PHP
Fiecare program PHP include doua linii speciale, care indica serverului
PHP ca textul cuprins intre cele doua linii este alcatuit din instructiuni
PHP. Practic, aceste linii pot fi asimilate copertelor unei carti, care
pastreaza unitatea programului dumneavoastra PHP. Intre aceste doua
linii vor fi scrise instructiunile PHP. Pentru a incepe sa scrieti un program
PHP, deschideti editorul dumneavoastra de texte si introduceti
urmatoarele doua linii :
<?php
?>
- Acesta este un cod de inceput si nu afiseaza nimic.
Apoi, salvati scriptul dumneavoastra sub forma de fisier text, in
directorul "www" din "wamp", cu un nume care respecta urmatoarele
reguli:
Este recomandat ca numele fisierului sa fie alcatuit numai din caractere
minuscule, cifre si liniute. Utilizarea de spatii, majuscule si alte caractere ar
putea crea probleme pe sisteme de operare diferite.
Extensia numelui fisierelor trebuie sa fie .php.
Asigurati-va ca ati ales un nume semnificativ, care sa descrie functia
scriptului dumneavoastra, astfel incat sa-l puteti identifica rapid dupa
saptamani sau chiar luni de la crearea acestuia. Veti descoperi ca liniutele
sunt utile pentru separarea cuvintelor care alcatuiesc numele fisierului,
marind astfel lizibilitatea acestuia. De exemplu, un fisier care contine un
script PHP ce va permite sa vizualizati salariile angajatilor poate primi
numele "[Link]". Chiar si la mult timp dupa crearea fisierului
respectiv, nu veti avea probleme in a determina scopul acestuia.
3. Afi sarea datelor de iesire intr-un browser Web
Programele PHP executa trei categorii de operatii elementare:
Obtin date de la un utilizator.
Executa prelucrari ale datelor, respectiv obtine accesul la datele stocate in
fisiere si baze de date si le manipuleaza.
Afiseaza date astfel incat un utilizator sa le poata vizualiza.
Primele doua operatii sunt oarecum mai dificil de realizat decat cea dea treia. Totusi, afisarea datelor astfel incat acestea sa fie vizibile
utilizatorului este o operatie foarte simpla. Asa cum paragrafele unui
text scris sunt compuse din propozitii, programele PHP sunt alcatuite din
instructiuni. Regulile care controleaza formarea propozitiilor se numesc
sintaxa. Acelasi termen este folosit si pentru a desemna regulile care
guverneaza formarea instructiunilor PHP.
Iata un exemplu pentru crearea instructiunii PHP care trimite date de
iesire la un browser Web, astfel incat acestea sa fie vizibile pentru un
utilizator:
<?php
echo "scrieti aici un text oarecare";
?>
Observati ca instructiunea incepe cu un cavant "echo" si se incheie cu
un caracter punct si virgula (;).
Constructia echo trimite datele de iesire care vor fi afisate de browser.
Ghilimelele duble se folosesc pentru delimitarea unei expresii de tip text,
in cazul nostru "scrieti aici un text oarecare" (se pot folosi si ghilimele
simple).
In locul propozitiei "scrieti aici un text oarecare" puteti plasa aproape
orice text, cu exceptia altor ghilimele. Totusi, pentru moment, trebuie sa
includeti numai litere, cifre, spatii si semne de punctuatie folosite in
alfabetul latin, precum virgula, caracterul punct si virgula, punctul,
semnul de intrebare si semnul exclamarii. De asemenea, puteti include
caracterele < >, folosite pentru delimitarea etichetelor HTML, respectiv
caracterul /, folosit pentru a indica membrul de inchidere al unei perechi
de etichete HTML.
De exemplu, iata o instructiune PHP care are drept date de iesire un
fragment dintr-un vers din Scrisoarea a III-a de Eminescu:
<?php
echo "<h2> Iata vine-un sol de pace</h2>";
?>
- Ca sa vedeti rezultatul, salvati fisierul cu acest cod in
directorul www din "wamp", de exemplu cu denumirea [Link] si
apelati in browser adresa[Link] (programul
WampServer trebuie sa fie pornit).
Perechea de etichete H2 determina formatarea datelor de iesire ca titlu
HTML de nivel 2.
Scripturile PHP pot fi incluse si in fisiere cu cod HTML, ca in urmatorul
exemplu (dar salvate cu extensia ".php"):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Test PHP</title>
</head>
<body>
<?php
echo "<h4> Exemplu de script PHP inclus in HTML</h4>" ;
?>
</body>
</html>
In browser va aparea :
Exemplu de script PHP inclus in HTML
Pot fi incluse si scripturi mai complicate ce contin zeci sau chiar sute de linii, atata timp
cat acestea sunt incluse intre cele doua linii specifice limbajului PHP:
<?php
?>
4. Documentarea unui script PHP
In afara de a furniza nume descriptive fisierelor ce contin scripturile
dumneavoastra PHP, e necesar sa includeti in interiorul fiecarui script
atat comentarii care sa permita unui cititor sa determine cu usurinta
utilitatea scriptului, cat si alte informatii referitoare la script. De
exemplu, puteti include un comentariu care precizeaza numele autorului
scriptului si ce face acesta.
Iata un model sintactic pentru comentariile PHP:
// Scrieti aici comentariul dumneavoastra (pe o singura linie)
Dupa cum se poate vedea, un comentariu incepe cu doua caractere
slash, urmate de un spatiu. n continuare, linia contine comentariul
dumneavoastra, care poate include orice caractere doriti, inclusiv
caractere speciale.
Iata un exemplu simplu de script PHP care include comentarii:
<?php
// Script de la [Link]
// Acest script afiseaza un mesaj vizibil pentru utilizator.
echo "Acesta este un script foarte simplu.";
?>
Nota: Fiecare linie a comentariului trebuie sa inceapa cu doua caractere slash //. Totusi,
puteti crea un comentariu din mai multe linii si in alte moduri. Iata un exemplu:
/*
Acesta este un comentariu pe mai multe linii.
Poate fi alcatuit dintr-un numar oricat de mare de linii.
*/
Pentru a adauga un comentariu alcatuit din mai multe linii, scrieti la inceput
caracterele /*, iar la sfarsit trebuie sa se incheie cu caracterele */. Intre cele doua perechi
de caractere, puteti scrie orice text doriti, folosind oricate linii doriti.
5. Executarea unui script PHP
Dupa ce ati creat un script PHP, veti dori sa-l executati.
Sa luam un alt exemplu, ce contine cod HTML si comentarii:
Deschideti editorul dumneavoastra de texte si introduceti urmatoarele
linii :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Test PHP</title>
</head>
<body>
<?php
// Script test
// Acest script afiseaza un mesaj vizibil pentru utilizator.
echo "Primul meu script PHP.";
?>
</body>
</html>
Salvati fisierul cu numele [Link]
Daca ati instalat un server de PHP pe calculatorul dumneavoastra,
salvati fisierul in directorul www al serverului.
Deschideti browserul si scrieti adresa URL [Link]
Daca nu aveti instalat un server de PHP pe calculator, incarcati (prin FTP)
fisierul [Link] pe un server pe web unde este instalat PHP.
Dupa ce v-ati incarcat fisierul cu scriptul, sunteti pregatit pentru a obtine
accesul la acesta. Deschideti browserul Web si apelati adresa URL
asociata scriptului dumneavoastra. Adresa URL trebuie sa fie alcatuita
din adresa URL identificata de administratorul serverului unde ati
incarcat scriptul, urmata de un slash (/), urmata de numele fisierului care
contine scriptul dumneavoastra. Daca adresa URL se incheie deja cu un
caracter slash, nu trebuie sa mai inserati inca un asemenea caracter
inainte de numele scriptului dumneavoastra.
De exemplu, daca domeniul serverului unde ati incarcat scriptul
e [Link] ca adresa URL a catalogului care contine
scripturile dumneavoastra PHP, puteti obtine accesul la scriptul
dumneavoastra prin intermediul adresei
URL [Link]
Daca ati tastat corect adresa URL a scriptului dumneavoastra, iar scriptul
respectiv nu contine erori, veti vedea datele de iesire ale scriptului
dumneavoastra. Felicitari! Ati devenit programator PHP!
Tipuri de siruri si variabile
nvatati tipul variabilelor in PHP
nvatati sa folositi ghilimele si caractere escape pentru a specifica valori de
tip sir speciale
Numere si siruri, tipul variabilelor
Programele de calculator manipuleaza datele, care reprezinta
informatii. Programele PHP folosesc doua categorii principale de date:
numere si siruri. Numerele sunt compuse mai ales din cifre, n timp ce un
sir poate contine orice caracter, inclusiv cifre, litere si simboluri speciale.
Decizia privind modul de stocare a datelor este importanta, n mod
caracteristic, datele se stocheaza sub forma de numere atunci cnd se
doreste executarea unor operatii matematice asupra datelor, deoarece
numerele sunt stocate ntr-un mod care permite efectuarea de calcule.
Pe de alta parte, sirurile sunt stocate folosind o modalitate care
faciliteaza ntelegerea lor de catre operatorul uman. Datele trebuie
stocate sub forma de siruri daca formatul acestora nu este numeric sau
daca doriti ca operatorul uman sa fie capabil de a introduce sau de a
vizualiza datele. Practic, puteti asimila numerele cu un mod de stocare a
datelor n interiorul calculatorului. Sirurile se pot asimila unui mod de
stocare a datelor n afara calculatorului.
Aceste doua mari categorii de date: numere si siruri, formeaza opt tipuri
principale de variabile :
- Boolean
- Integer
- Float
- String
- Array
- Object
- Resource
- Null
In mod normal tipul variabilelor nu este specificat explicit; acesta va fi
evaluat de catre interpretorul PHP la momentul run-time (in momentul
executarii scriptului).
1. Tipul boolean
Variabilelele de tipul boolean pot lua doar doua valori : FALSE sau TRUE
Variabilele de alt tip decat boolean pot fi convertite la tipul boolean prin operatorul
cast (bool) sau (boolean), plasate inaintea valorilor, desi in general nu e nevoie de
aceasta converrire, valoarea fiind automat recunoscuta de PHP.
. Tipul integer
PHP foloseste doua categorii de numere: ntregi (tipul integer) si duble,
cu virgula (tipul float)
Variabilele integer reprezinta numerele intregi, ele pot fi specificate in
format zecimal, hexazecimal sau octal.
Numerele ntregi reprezinta numerele fara parte fractionara folosite la
numarare, plus zero si numerele negative. Cu alte cuvinte, n PHP
termenul de ntreg are aceeasi semnificatie ca si n matematica. De
exemplu, numarul 100 poate fi reprezentat n PHP sub forma de ntreg.
Scrierea numerelor PHP este simpla. Un ntreg PHP se obtine prin
scrierea cifrelor care i alcatuiesc valoarea. Daca valoarea este negativa,
scrieti un semn minus imediat la stnga numarului. Evitati sa scrieti
spatii sau virgule ca parte a unui ntreg PHP.
Iata cteva exemple de numere PHP ntregi :
215678 - Numar in reprezentare zecimala
0x1A8;
- Numar in reprezentare hexazecimala (reprezinta:
1*16*16 + 10*16 + 8 = 424 (in zecimal))
067
- Reprezinta: 6*8 + 7 = 55 (in zecimal)
Valorile minime, respectiv maxime pe care le poate lua o variabila de tip
integer depind de sistemul de operare pe care ruleaza modulul PHP. De
exemplu pentru un sistem Windows valoarea unui integer se memoreaza
pe 32 de biti: 31 bit pentru numar si un bit pentru semn. In acest caz
valorile unui intreg se afla in intervalul :-231 repectiv: 231. Daca incercam
sa folosim un integer cu valori care ies din acest inteval vor avea de-a
face cu un fenomen de depasire : integer overflow. In acest caz
interpretorul PHP converteste acesta valoare intr-o valoare de tip float
(care are un interval mai extins de valori).
In PHP simpla impartire a doua valori intregi va produce ca rezultat o variabila de tip
float. Pentru a obtine doar partea intreaga acestui rezultat putem folosi operatorul
cast (int) in fata rezultatului.
Ex.: echo (int)8.7; (va returna 8)
Pentru a rotunji rezultatul la intregul cel mai apropiat de valoarea reala se poate folosi
functia round(), unde intre paranteze se adauga valoarea.
Ex.: echo round(8.7); (va returna 9)
3. Tipul float
Reprezinta variabile de tip real [numerele cu virgula], (n lb. engleza se
foloseste punctul zecimal n loc de virgula). De exemplu 2.5
In general, numerele duble (tipul float) sunt stocate folosindu-se
formatul standard IEEE-64, care furnizeaza 64 de biti. Acest format va
permite sa stocati valori care pot merge pna la 1,8 x 10 la puterea 308
sub forma de numere duble si furnizeaza aproximativ 14 cifre dupa
punctul zecimal (sau cifre semnificative) de precizie.
Iata cteva exemple de numere duble (tipul float)
123.4567
- Numar de tip float
1.2e3;
- Reprezinta: 1.2 * 103
4. Tipul string
Reprezinta o insiruire de caractere, fiecare caracter este memorat pe 1
byte; setul de caractere este limitat la 256 valori distincte. Dimensiunea
sirurilor poate fi oricat de mare in PHP, nu exista specificatii care sa
limiteze numarul maxim de caractere dintr-un sir.
Spre deosebire de ntregi si de numere float, care contin cifre, sirurile pot
contine orice caracter. Ca atare, sirurile sunt utile pentru stocarea
datelor care nu pot fi calculate, precum nume, fraze si adrese.
In PHP, un sir poate fi declarat in mai multe feluri:
1) Un mod simplu de a declara un sir este prin delimitarea cu
ghilimele simple (' ')
Daca dorim ca sirul sa contina caracterul ' va trebui sa inseram inaintea
lui caracterul escape \. Daca dorim ca sirul sa contina caracterul \ va
trebui sa dublam acest caracter. Acest comportament este exemplificat
in exemplul urmator:
<?php
$var1 = 'Acesta este un sir de test';
echo 'Curs \'PHP\'';
echo '<br />Vrei sa stergi C:\\*.* ?';
echo '<br />Variabila var1=$var1';
echo "<br />Variabila var1=$var1";
?>
In browser va aparea:
Curs 'PHP'
Vrei sa stergi C:\*.* ?
Variabila var1=$var1
Variabila var1=Acesta este un sir de test
Observati diferenta dintre ultimile doua linii!
In penultima linie, unde s-a folosit gilimele simple pentru delimitarea sirului, variabila
$var1 nu este expandata adica nu este afisat valoarea variabilei var1=Acesta este un
sir de test ci exact textul scris (numele ei). Pentru a realiza afisarea valorii variabilei si
nu numele acesteia, se folosesc ghilimelele duble, precum in ultima linie a exemplului de
mai sus.
2) O alta metoda pentru a specifica un sir n PHP este prin
folosirea ghiimelelor duble (" ").
Daca intr-un sir delimitat prin ghilimele duble vrem ca acesta sa afiseze
numele unei variabile, nu valoarea acesteia, adaugam un caracter
backslash (\) inaintea numelui variabiei.
Exemplu; echo "Numele variabilei este \$var";
Acest cod va afisa Numele variabilei este $var, oricare ar fi valoarea
variabilei "$var".
Caracterele care alcatuiesc sirul sunt incluse ntre ghilimele duble (" ");
De exemplu, sirul reprezentnd numele fizicianului care a formulat teoria
relativitatii este "Albert Einstein". Asa cum s-a explicat, un sir poate
contine date numerice; de exemplu, "3.14159".
Daca se doreste adaugarea de ghilimele duble intr-un sir delimitat de
ghilimele duble, se adauga caracterul \ in fata acestora.
Exemplu; echo "Numele programului este \"PHP\".";
Prin delimitarea cu ghilimele duble PHP faciliteaza includerea n siruri a
unor caractere speciale, precum caracterele de salt la linie noua sau
retur de car, prin furnizarea de secvente escape care reprezinta
caractere speciale.
Iata secventele escape folosite n PHP:
\n - salt la linie noua
\r - retur de car (rand nou)
\t - caracter de tabulare pe orizontala
\\ - backslash
\$ - simbolul dolarului
\" - ghilimele duble
Ca exemplu, iata un sir care include un retur de car, urmat de un salt la
linie noua: "Salut, lume!\r\n".
Retineti ca fiecare secventa escape ncepe cu un backslash (\). Pentru a include un
backslash ntr-un sir, trebuie sa folositi doua caractere backslash.
Pe langa imbricarea variabilelor in cadrul sirurilor delimitate prin
ghilimele duble, PHP pune la dispozitie operatorul de concatenare a
sirurilor: . (punct) . Acest operator adauga un sir la sfarsitul altui sir. De
exemplu:
<?php
$nume = 'Popescu';
$prenume='Costel';
echo 'Numele de familie este '.$nume. 'iar prenumele este '.$prenume;
?>
In browser va aparea:
Numele de familie este Popescu iar prenumele este Costel
In anumite situatii este necesar sa accesam unul dintre caracterele
unui sir. Pentru aceasta putem folosi parantezele{} ca in exemplul de
mai jos:
<?php
$var1 = 'Acesta este un sir de test';
echo $var1{0};
// Afisaza A (primul caracter din sir)
echo $var1{2};
// Afisaza e (al treilea caracter din sir)
?>
Rezultatul afisat va fi
Ae
3) Sintaxa heredoc este o alta modalitate de a delimita siruri
In acest caz delimitatorul este ("<<<"); acesta trebuie urmat de un
identificator unic, dupa care urmeaza sirul de caractere, iar secventa se
incheie din nou cu identificatorul mentionat. Identificatorul de incheiere
trebuie sa se afle in prima coloana a liniei, acesta poate contine
caractere alfanumerice dar neaparat trebuie sa inceapa cu o litera, nu cu
o cifra sau alt semn.
Veti intelege mai bine studiind exemplu de mai jos:
<?php
$var1 = <<< EOT
Exemplu de sir care foloseste delimitatorul heredoc.
EOT;
echo $var1;
?>
Rezultatul afisat va fi:
Exemplu de sir care foloseste delimitatorul heredoc.
5. Tipul array
Reprezinta un vector de valori (care creaza o matrice, vezi Lectia
9 despre matrice), fiecare element al matricei are asociat o cheie.
Aceasta cheie va fi folosita ulterior la identificarea unui element specific
at matricei. In PHP tipul array se mai numeste si tip map ordonat,
deoarece elemente vectorului sunt ordonate dupa campul cheie.
Variabilele de tip array si lucrul cu acestea vor fi prezentate mai detaliat
in lectiile urmatoare. Iata un exemplu simplu de variabile array:
<?php
$fructe[0] = 'mere';
$fructe[1] = 'caise';
$fructe[2] = 'piersici';
?>
6. Tipul object
Reprezinta de fapt instanta unei clase declarate in PHP. O clasa este o
structura care contine variabile membru si functii membru.
Variabilele de tip object si lucrul cu acestea vor fi prezentate detaliat in
lectiile urmatoare.
7. Tipul resource
Este un tip special de variabila care pastreaza o legatura spre resurse
externe. Exemple de resurse externe: manipulatori pentru deschidere de
fisiere, conectare la baze de date, compresia fisierelor, resurse COM,
etc...
8. Tipul NULL
Reprezinta varibilele care nu au inca atribuita o valoare.
O variabila se considera a avea valoarea Null daca:
- este setata explicit prin atribuirea valorii NULL
- nu a fost asignata inca o valoare acestei variabile
- variabila a fost stearsa prin functia unset();
Putem afla tipul unei variabile folosind functia gettype() care
returneaza un string (sir) continand tipul variabilei cercetate.
Observati si studiati exemplul de mai jos
<?php
$var1 = TRUE;
$var2 = 100;
$var3 = 23.88;
$var4 = "Nume";
$var[5] = "fructe";
echo gettype($var1);
echo '<br />'.gettype($var2);
echo '<br />'.gettype($var3);
echo '<br />'.gettype($var4);
echo '<br />'.gettype($var[5]);
echo '<br />'.gettype($var6);
?>
Variabile si operatori PHP
Intelegeti diferenta dintre valori si variabile
Invatati modul de utilizare a operatorilor pentru combinarea valorilor n
expresii
Invatati modul de utilizare a functiilor pentru executarea operatiilor
elementare
1. Valori si variabile
Daca se asociaza o valoare cu un nume, ca si in algebra, este posibila
modificarea acelei valorii prin referire la numele respectiv. O valoare cu
nume se numeste variabila, deoarece.
In limbajul PHP variabilele sunt reprezentate prin semnul $ urmat de
numele variabilei.
Numele variabilei este case sensitive, adica conteaza daca numele
este scris cu litere mari sau mici. Intotdeuna numele variabilelor trebuie
sa inceapa cu o litera sau o liniuta de subliniere (_) si poate fi urmat de
litere sau cifre.
Iata cateva exemple de nume de variabila:
$var
$Numar
$_elemente
Pentru a asocia o valoare unei variabile, veti scrie cu un semn egal,
asa:
$temperatura = 33.5;
Semnul egal este urmat de valoarea care urmeaza a fi atribuita
variabilei, in acest exemplu, valoarea este data de valoarea literala
dubla (float) 33.5. Caracterul punct si virgula (;) marcheaza sfarsitul
instructiunii.
De asemenea, puteti atribui valoarea unei variabile catre o alta variabila,
prin scrierea unei instructiuni de atribuire astfel:
$castigator = $nume;
In acest caz, valoarea variabilei $nume devine valoarea variabilei
$castigator. Acest procedeu se numeste. Astfel o modificare facuta
asupra lui $nume se va propaga automat si asupra variabilei $castigator.
Iata exemplul de mai sus asa cum va aparea intr-un script PHP simplu :
<?php
$nume = "Cosmin";
$castigator = $nume;
echo $castigator;
?>
Rezultatul afisat va fi:
Cosmin
Exista si un alt tip de atribuire valoare de la o variabila la alta,
denumita atribuire prin referinta (folosind si caracterul "&"), aceasta
de fapt leaga cele doua variabile, vedeti tutorialul: Atribuire valoare prin
referinta .
Forma valorii unei variabile se numeste tipul variabilei. Tipul unei variabile
se poate modifica daca atribuiti variabilei o valoare de un tip diferit fata
de cel al valorii curente a variabilei.
De exemplu, instructiunea de atribuire
$x = 3;
Atribue variabilei $x tipul integer.
Daca instructiunea de atribuire
$x = 3.5;
va fi executata ulterior, variabila $x devine de tip float.
Desi instructiunile de atribuire din limbajul PHP si ecuatiile matematice folosesc ambele
semnul egal, cele doua notiuni sunt foarte diferite, deoarece atribuirea nu este acelasi
lucru cu egalitatea. Atribuirea este o operatie care inlocuieste o valoare cu o alta. Pe de
alta parte, egalitatea este o relatie intre doua valori. Cand doua valori sunt egale, acestea
raman egale pentru totdeauna. Totusi, puteti atribui o valoare unei variabile si ulterior
puteti atribui aceleiasi variabile o alta valoare. Cu alte cuvinte, egalitatea este
permanenta; atribuirea nu este.
Variabilele declarate mai sus sunt definite de utilizator. In PHP exista si
alte variabile numite "variabile predefinite" care rezida in nucleul PHP,
sunt alocate automat de catre modulul PHP, si sunt accesibile in
program.
In continuare enumeram citeva dintre aceste "Variabile Superglobale"
(accesibile din toate scripturile PHP):
$GLOBALS contine referinte la variabilele globale disponibile in scriptul
curent.
$_SERVER variabile definite de server sau relative la contextul in care se
executa scriptul curent
$_GET variabile furnizate scriptului prin adresa URL
$_POST variabile furnizate scriptului prin metoda HTTP POST (in general
prin formulare)
$_COOKIE variabile furnizate scriptului prin HTTP cookie
$_FILES furnizeaza scriptului fisierele uploadate
$_SESSION variabile care sunt inregistrate in sesiunea scriptului
2. Operatori
Pentru a va ajuta sa efectuati calcule si prelucrari ale datelor, PHP
include o diversitate de operatori si functii utile. Cand combinati valorile
literale si variabilele cu operatori si functii, construiti ceea ce este
cunoscut sub numele de expresii.
Operatorii sunt simboluri specifice care realizeaza o actiune specifica in
cadrul unei expresii.
Operatorii actioneaza asupra variabilelor prezente in expresie. De
exemplu in cadrul expresiilor matematice vom folosi operatori aritmetici.
$a + $b
Adunare : a+b
$a - $b
Scadere : a-b
$a * $b
Inmultire: a*b
$a / $b
Impartire: a/b
$a%$a
Moule :restul impartirii lui a la b
$a +=$b Echivalent cu: $a = $a + $b
$a -=$b
Echivalent cu: $a = $a - $b
$a *=$b
Echivalent cu: $a = $a * $b
$a /=$b
Echivalent cu: $a = $a / $b
$a++
Incrementare ; Ecivalent cu $a = $a +1
$a--
Decrementare; Echivalent cu $a = $a -1
O proprietate interesanta a operatorului de impartire este aceea ca
returneaza o valoare intreaga daca ambii sai operanzi sunt intregi si
rezultatul este un intreg; in caz contrar, returneaza o valoare cu virgula
(de tip float). Astfel, instructiunea de atribuire
$x = 10/3;
atribuie valorii $x valoarea cu virgula 3.3333333333333, chiar daca
operanzii operatorului de impartire sunt ambii intregi.
Similar operatorului de impartire, operatorul modulo executa o
impartire; cu toate acestea, operatorul modulo returneaza restul, nu
catul impartirii. De exemplu, prin impartirea lui 10 la 3 se obtine catul 3
si restul 1. Deci, instructiunea de atribuire
$x = 10%3;
atribuie variabilei $x valoarea 1.
Operatorii de incrementare $a++ si decrementare $a-- au un efect
diferit daca sunt scrisi ++$a respectiv --$a
In primul caz, daca avem de exemplu
$x= $a++;
i-se atribue lui $x valoarea variabilei $a dupa care se efectueaza
operatia de incrementare ($a = $a + 1)
Dar daca avem
$x = ++$a=
se efectueaza operatia de incrementare ($a = $a + 1) dupa care i-se
atribue lui $x noua valoarea a lui $a
Ca in matematica, PHP evalueaza operatorii de inmultire si de impartire anterior
operatorilor de adunare, respectiv scadere. Aceasta caracteristica se numeste
precedenta.
Datorita precedentei, instructiunea
$x=1+2*3;
atribuie variabilei $x valoarea 7, chiar daca operatorul de adunare apare inaintea celui de
inmultire. Se respecta regulile din matematica. Daca doriti sa controlati precedenta unei
expresii, puteti folosi paranteze. De exemplu, instructiunea
$x=(1+2)*3;
atribuie variabilei $x valoarea 9, deoarece partea inclusa intre paranteze a expresiei este
evaluata prima, asa cum se procedeaza in algebra.
In afara de acesti operatori numerici, PHP include un operator de
concatenare a sirurilor (.), denumit uneori operator de unire,
deoarece functia sa consta in unirea sirurilor.
Sa observam urmatorul exemplu:
<?php
$var1 = 'Ionescu';
echo 'Numele candidatului este '.$var1;
$var2 = 'Candidat: ';
$var2 .= $var1;
echo "<br />$var2";
?>
Rezutatul afisat va fi:
Numele candidatului este Ionescu
Candidat: Ionescu
In exemplul de mai sus se observa folosirea operatorului de
concatenare . (punct)
Acest operator adauga la sfarsitul sirului curent noul sir furnizat ca
parametru.
Expresia $a .= 'Sir de test' este echivalenta cu : $a = $a . 'Sir de
test'.
3. Functii
In afara de operatori, PHP include functii care executa operatii utile.
Iata unele exemple de functii:
abs(x) - Returneaza valoarea absoluta a lui 'x'
ceil(x) - Returneaza valoarea 'x', rotunjita la intregul imediat superior
floor(x) - Returneaza valoarea 'x', rotunjita la intregul imediat inferior
max(x,y,...) - Returneaza valoarea maxima a unui set de valori
min(x,y,...) - Returneaza valoarea minima a unui set de valori
pow(x,n) - Returneaza numarul 'x', ridicat la puterea specificata 'n'
strftime(f) - Returneaza data curenta, formatata conform continutului
parametrului 'f'
sqrt(x) - Returneaza radacina patrata a lui 'x'
- In afara de acestea, PHP include multe alte functii. Consultati siteul [Link].
Majoritatea functiilor necesita una sau mai multe valori de intrare,
cunoscute sub numele de argumente. De exemplu, functia "sqrt" necesita
un argument (aici este 'x') care specifica valoarea a carei radacina patrata
trebuie calculata.
Unele functii, precum min() si max(), preiau un numar nedefinit de
argumente. Alte functii nu necesita nici un fel de argumente. Pentru a
putea folosi o functie in mod corespunzator, trebuie sa cunoasteti:
Numele functiei
Actiunea functiei si valoarea returnata de aceasta, daca exista
Numarul argumentelor preluate de functie
Semnificatia fiecarui argument
Iata un exemplu simplu care foloseste o functie pentru calculul lungimii
laturilor unui patrat, daca este cunoscuta aria patratului:
$latura=sqrt($arie);
Retineti modul in care argumentul functiei este inclus intre paranteze,
precum si modul in care functia si argumentul sau sunt folosite intr-un
mod asemanator cu o valoare literala sau o variabila.
Iata un exemplu care prezinta modul de utilizare a functiei "max", care
preia mai multe argumente:
$punctaj_maxim=max($punctaj1, $punctaj2, $punctaj3);
Rezultatul dat variabilei "$punctaj maxim" va fi determinat de functia
"max", aceasta determinand valoarea cea mai mare a argumentelor din
paranteza.
Observati ca fiecare argument este separat de vecinul sau printr-o
virgula.
Utilizare formulare HTML cu PHP, $_GET si $_POST
Invatati sa trimiteti date prin formulare HTML
Invatati sa preluati date trimise prin GET si POST
1. Proiectarea unui formular
Principalele sarcini n proiectarea unui formular HTML le constituie
alegerea controalelor HTML care vor fi incluse n formular, selectarea
amplasamentului controalelor si alegerea numelui acestora.
Studiati lectia HTML despre Formulare, aceasta explica modul de
realizare a fiecarui obiect dintr-un formular HTML si va va ajuta sa
invatati rolul acestor elemente HTMLL.
2. Crearea unui formular
Un formular HTML trebuie sa contina un buton de expediere, submit,
pe care utilizatorul executa clic pentru a trimite datele din formular la
scriptul PHP.
Formularele se creaza folosind etichete specifice incadrate in tagul <form> </form> ca in exemplul de mai jos:
<form action="[Link]" method="post">
Nume:<input type="text" name="nume" />
<br /><input type="submit" name="submit" value="Trmite formular" />
</form>
In browser se va vedea:
Nume:
Trmite formular
Fiecare element al formularului trebuie introdus intre
etichetele <form> si </form>.
Atributul "action" indica fisierul cu scriptul care va primi datele de la
formular si reprezinta una dintre cele mai importante precizari.
Fiecare element, camp dintr-un formular trebuie sa aibe un nume
distinct, dat prin atributul "name"; acest nume este folosit de scriptul
PHP la care sunt trimise datele, astfel, scriptul PHP recunoaste datele din
campul respectiv folosind numele acestuia.
3. Utilizarea metodelor GET si POST
Atributul "method" poate avea doua valori : GET si POST. Diferenta
intre metodele GET si POST consta in modul in care informatia din
formular este transmisa scriptului care o prelucreaza.
- Metoda GET trimite toate informatiile adunate ca parte a adresei URL;
aceste informatii sunt vizibile pentru utilizator.
- Metoda POST transmite informatia intr-o maniera invizibila pentru
utilizator si poate transmite o cantitate mai mare de date decat GET.
Folosind exemplul de formular de mai sus, metoda GET va transmite
serverului o adresa URL ca cea de mai jos:
[Link]
iar in cazul folosirii metodei POST, in URL va aparea doar:
[Link]
Metoda GET permite transmiterea unui volum limitat de informatii catre
server; de asemenea nu este recomandata folosirea acestei metode in
cazul in care dorim sa transmitem date personale(de exemplu parolele
introduse intr-un formular pot fi vizualizate de oricine in browserul de
Web).
4. Receptionarea datelor de la un formular HTML
In general datele din formular sunt preluate de scriptul PHP prin
urmatoarea formula:
$_POST['nume'] - daca este folosit method="post"
$_GET['nume']
- daca este folosit method="get"
- unde "nume este valoarea atributului name al elementului din
formularul HTML.
Sa luam un exemplu practic de formular HTML care trimite date (prin
method="post") la un script PHP unde acestea vor putea fi vizualizate.
Salvam scriptul de mai jos intr-un fisier pe care-l numim "[Link]"
<?php
$nume = $_POST['nume'];
$email = $_POST['email'];
$parola = $_POST['parola'];
echo "Nume = $nume";
echo "<br />E-mail = $email";
echo "<br />Parola = $parola";
?>
Scriem urmatorul cod HTML intr-un alt fisier "[Link]", pe care-l salvam
in acelasi director cu scriptul PHP de mai sus.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"[Link]
<html xmlns="[Link] xml:lang="ro" lang="ro">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title> Test-Form </title>
</head>
<body>
<form action="[Link]" method="POST">
Nume:<input type="text" name="nume" />
<br />Email:<input type="text" name="email" />
<br />Parola:<input type="password" name="parola" />
<br /><input type="submit" name="submit" value="Trmite datele" />
</form>
</body>
</html>
In browser va aparea:
Nume:
Email:
Parola:
Trmite datele
Completam datele din formular, de exemplu: la Nume : Popescu, la
Email : plomar@[Link] si Parola : parola_mea
Dupa ce am competat datele, apasam clic pe butonul "Trimite datele",
acestea vor fi trimise la scriptul PHP "[Link]", care le va prelucra si
va afisa urmatorul rezultat:
Nume = Popescu
E-mail = plomar@[Link]
Parola = parola_mea
Sa intelegem exemplu de mai sus.
Folosind formularul de mai sus, atributul NAME din fiecare eticheta INPUT
atribuie fiecarei casete cu text un nume, astfel scriptul PHP va putea
recunoaste datele scrise in casete. In scriptul "test-form".php" vom
accesa variabilele:
$nume va primi informatia introdusa in campul Nume
$email va primi informatia introdusa in campul Email
$parola va primi informatia introdusa in campul Parola
Deoarece cunoastem metoda prin care trimitem datele catre scriptul PHP,
"POST", am folosit variabila PHP globala _POST pentru a prelua datele din
formular:
$_POST['nume']
$_POST['email']
$_POST['parola']
Constructia echo trimite datele de iesire care vor fi afisate de browser
Variabile PHP globale: _GET si _POST reprezinta de fapt variabile de tip array, fiecare
element se poate accesa prin cheia sa; in cazul nostru cheia fiecarui element este data de
atributul : NAME al casetelor din formular
5. Trimiterea de date unui script prin adresa URL
In afara de a expedia unui script datele printr-un formular, puteti
expedia date cu ajutorul adresei URL a paginii. Pentru aceasta, atasati la
sfarsitul adresei URL un semn al ntrebarii (?) si apoi includeti o serie de
perechi "nume-valoare" (separate prin &), ca in exemplu urmator:
[Link]
Exemplul include numai doua perechi "nume-valoare"; cu toate acestea,
puteti include oricte asemenea perechi doriti (separate prin
caracterul &), in functie de limita impusa de browser.
Pentru a prelua si folosi datele dintr-o astfel de adresa URL, folositi in
interiorul scriptului PHP expresia "$_GET['nume'], ca in exemplu
urmator"
$var1 = $_GET['nume1']
$var2 = $_GET['nume2']
Unde "nume1" si "nume2" sunt numele variabilelor din adresa URL, iar
"$var1" si "$var2" sunt variabilele care vor fi folosite in scriptul PHP (din
"[Link]") si a caror valori vor fi "valoare1" respectiv "valoare2"
continute in adresa URL.
Daca doriti sa trimiteti unui script, prin intermediul adresei sale URL,
caractere speciale precum un semn al intrebarii, un semn egal sau un
ampersand, se poate crea confuzie.
Pentru a functiona corect, un sir trebuie sa fie codificat URL. Pentru a
codifica URL un sir, caracterele speciale se nlocuiesc cu echivalentele lor
hexazecimale, precedate de un simbol procent (%). Pentru alte detalii,
consultati lectia despre Utilizarea caracterelor speciale, subtitlul 4
( Conversia adreselor URL).
De exemplu, forma codificata URL a sirului "la multi ani!" este %22la
multi ani%21%22.
Adresa URL rezultanta se numeste "sir de interogare" si nu poate contine
spatii. Daca doriti sa trimiteti un spatiu ca parte a unui sir de interogare,
trimiteti n locul spatiului un semn plus (+). Iata un exemplu de sir de
interogare care codifica numele autorului acestui site:
[Link]
Unele dintre cele mai comune caractere speciale si echivalentele lor
codificate URL sunt prezentate n tabelul de mai jos:
Caracter
Echivalentul codificat
special
URL
.
*%2e
>
%3e
%5e
%7e
%2b
%2c
%2f
%3a
%3b
%3c
%3d
>
%3e
%5b
%5c
%5d
%5f
%7b
%7c
%7dc
tab
%09
spatiu
%20
%21
%22
%23
%24
%25
&
%26
%27
%28
%29
%40
%60
Variabile de mediu si erori
In aceasta lectie invatati sa obtineti accesul la valorile variabilelor de mediu.
Invatati despre depanarea si tratarea erorilor.
1. Obtinerea si utilizarea datelor de la o variabila de mediu
Variabilele de mediu sunt folosite pentru stocarea optiunilor si a
parametrilor care personalizeaza mediul de aplicatie. Aplicatiile pot
obtine accesul la valorile variabilelor de mediu si in functie de acestea si
pot ajusta comportamentul.
De exemplu, calea de cautare a programelor MS-DOS este stocata ntr-o
variabila de mediu denumita PATH. In general, comenzile sistemelor de
operare sunt folosite pentru a configura variabilele de mediu si pentru a
stabili valorile acestora. Cu toate acestea, unele aplicatii manipuleaza
valorile variabilelor de mediu.
Att serverul Web Apache, ct si serverul de aplicatie PHP folosesc
variabile de mediu pentru a prezenta informatii de stare. Unele dintre
cele mai importante variabile de mediu folosite de Apache si PHP sunt
rezumate n tabelul de mai jos. Numeroase servere Web, altele dect
Apache, furnizeaza o parte din aceste variabile de mediu sau chiar pe
toate.
Multe dintre aceste variabile reflecta caracteristicile cererii HTTP care a
solicitat executia PHP. Puteti vizualiza toate variabilele de mediu
disponibile pentru programele PHP prin invocarea functiei phpinfo() si
vizualizarea datelor de iesire generate de aceasta.
Vizualizarea datelor unei variabile de mediu se poate face folosind
variabila $_SERVER si o cheie (intre paranteze patrate) ce repreinta
numele variabilei de mediu.
De exemplu, pt. afisarea domeniului serverului unde ruleaza scriptul
echo $_SERVER['SERVER_NAME'];
Variabila de mediu
Descriere
CONTENT_LENGTH
- Lungimea, n octeti, a corpului cererii.
CONTENT_TYPE
- Tipul MIME al datelor din corpul cererii.
DOCUMENT_ROOT
- Calea care constituie radacina arborelui
catalogului cu documente al serverului Web.
GATEWAY_INTERFA - Returneaza ersiunea protocolului CGI (Common
CE
Gateway Interface) folosit de serverul Web.
HTTP_ACCEPT
- Continutul antetului HTTP Accept.
- Continutul antetului HTTP Accept-Charset:,
HTTP_ACCEPT_CHA
care specifica seturile de caractere ntelese de
RSET
client.
- Continutul antetului HTTP Accept-Encoding:,
HTTP_ACCEPT_ENC
care specifica tipurile de continuturi ntelese de
ODING
client.
HTTP_ACCEPT_LAN - Continutul antetului HTTP Accept-Language:,
GUAGE
care specifica limbajele preferate de client.
HTTP_CONNECTION
- Continutul antetului HTTP Connection:, care
indica optiunile solicitate de client.
HTTP_HOST
- Continutul antetului HTTP Host:, care indica
numele de gazda, folosit de client la prezentarea
cererii.
HTTP_REFERER
- Adresa URL a paginii Web care a trimis clientul
la pagina curenta.
HTTP_USER_AGENT
- Continutul antetului HTTP user-Agent, care
indica tipul si versiunea browser-ului folosit.
PATH
- Calea de executie asociata cu mediul
serverului.
QUERY_STRING
- Sirul de interogare, daca exista, prin care a fost
accesata pagina.
REMOTE_ADDR
- Adresa IP a clientului (vizitatorului).
REMOTE_HOST
- Numele de gazda al clientului.
REMOTE_PORT
- Adresa portului clientului de unde a pornit
cererea.
REQUEST_METHOD
- Metoda de cerere HTTP folosita; de exemplu,
GET, POST, PUT sau HEAD.
REQUEST_URI
- URI folosit pentru accesul la pagina curenta.
URI este alcatuit dintr-un URL si un sir optional
de interogare.
SCRIPT_FILENAME
- Numele de cale absolut al scriptului curent.
SCRIPT_NAME
- Adresa URL a scriptului curent.
SERVER_ADMIN
- Adresa de e-mail a administratorului serverului
Web.
SERVER_HOST
- Numele de gazda asociat serverului Web care
prelucreaza cererea.
SERVER_PORT
- Portul folosit de serverul Web pentru
comunicatii.
SERVER_PROTOCOL
- Numele si versiunea protocolului prin
intermediul caruia s-a executat cererea.
- Sirul care identifica versiunea serverului Web si
SERVER_SIGNATUR
numele de gazda folosit pentru prelucrarea
E
cererii.
SERVER_SOFTWARE
- Sirul care identifica programul server Web si
versiunea acestuia.
- O lista completa a acestor variabile de mediu o gasiti la pagina
oficiala $_SERVER
Puteti obtine accesul la variabila de mediu folosind
variabila $_SERVER care este de fapt un Array in care cheile
elementelor sunt numele variabilelor de mediu
De exemplu, urmatoarea instructiune echo trimite browserului adresa IP
a clientului (vizitatorului):
<?php
$ip = $_SERVER['REMOTE_ADDR'];
echo "Adresa dv. IP este $ip";
?>
Afisarea sau nu a acestor variabile globale depinde de permisiunile facute la
configurarea serverului PHP si de datele transmise.
2. Depanarea unui script
Uneori, n locul datelor de iesire ale scriptului dumneavoastra, puteti
vedea unul din urmatoarele:
Textul scriptului, n loc de datele de iesire ale acestuia
O caseta de dialog, prin care sunteti ntrebat daca doriti sa descarcati fisierul
care contine scriptul
Un mesaj n care se spune ca scriptul nu exista
Un mesaj n care se spune ca browserul dumneavoastra Web nu are
permisiunea de a obtine accesul la script
Un mesaj n care se spune ca scriptul dumneavoastra contine o eroare
La vizualizarea rezultatelor unui script PHP se pot produce numeroase
erori, chiar daca scriptul n sine este corect.
- Daca vedeti textul scriptului dumneavoastra sau o caseta de dialog prin
care sunteti ntrebat daca doriti sa descarcati fisierul care contine
scriptul, este posibil ca extensia fisierului script sa fie incorecta sau ca
serverul PHP sa nu functioneze. Desi fisierele script PHP trebuie sa aiba,
n general, extensia .php, este posibil (dar mai rar) ca un administrator
de sistem sa configureze un server PHP astfel nct acesta sa impuna o
alta extensie de fisier. Astfel, daca scriptul dumneavoastra esueaza din
unul dintre aceste doua motive, luati legatura cu administratorul
dumneavoastra de sistem.
- Daca vedeti un mesaj n care se spune ca scriptul nu exista, este posibil
ca dumneavoastra sa fi tastat incorect adresa URL. Verificati daca ati
tastat corect adresa URL identificata de administratorul dumneavoastra
de sistem, precum si daca ati atasat corect la aceasta numele fisierului
care contine scriptul, folosind un slash numai daca adresa URL
identificata de administratorul dumneavoastra de sistem nu se ncheie
cu acest caracter.
- Daca vedeti un mesaj n care se arata ca browserul dumneavoastra
Web nu are permisiunea de a obtine accesul la script, poate ca este
necesar sa modificati permisiunile fisierului script. Pentru a afla cum
trebuie procedat, consultati-va cu administratorul de sistem.
- Daca vedeti un mesaj n care se spune ca scriptul dumneavoastra
contine o eroare, verificati daca nu a aparut vreuna din urmatoarele
probleme:
O eroare de tastare, cum ar fi scrierea gresita a cuvntului echo
O eroare de punctuatie, cum ar fi paranteze, ghilimele sau punct si virgula,
lipsa sau inserate gresit
Neincluderea sau includerea eronata a liniilor de delimitare a scriptului, n
speta <?php si ?>
Un marcaj de comentariu ( / / ) care lipseste sau care a fost introdus gresit
De exemplu, iata un script care contine un tip de eroare frecvent ntlnit.
Puteti identifica eroarea?
<?php
// Acest script contine o eroare de sintaxa
echo "Salut, World Wide Web!;
?>
Din script lipseste caracterul ghilimele duble de nchidere, care trebuie
sa delimiteze expresia de tip text. Daca ncercati sa executati acest
script, puteti vedea doar o pagina goala sau o eroare similara celei
prezentate n continuare.
Parse error. Parse error in /home/bmccarty/public_html/php/module01/[Link] On line 7
Mesajul de eroare ncearca sa va indice sursa erorii, indicnd numarul
liniei la care s-a produs eroarea. Totusi, remarcati ca mesajul va ndruma
spre linia 7 a unui script care contine numai 4 linii. Din moment ce
ghilimelele duble de nchidere lipsesc, serverul PHP cauta dincolo de
sfrsitul scriptului pentru a gasi ghilimelele duble respective. Ca atare,
serverul PHP este oarecum derutat cu privire la sursa erorii.
Morala este aceea ca nu puteti conta n totalitate pe serverul PHP pentru
a determina locatia erorii; folositi numarul de linie furnizat de server
numai ca ndrumar pentru a depista locatia probabila a erorii.
3. Tratarea erorilor
Modulul PHP poate fi configurat astfel incat sa afiseze erorile intilnite in
codul PHP. Acest lucru poate fi foarte util in cazul depanarii programelor.
Pentru a activa afisarea erorilor exista doua metode:
- modificarea parametrului display_errors din fisierul de configurare "[Link]"
- folosirea functiei ini_set(display_errors);
In cazul primei metode trebuie sa avem drepturi de administrator pentru
a modifica fisierul [Link]. Nu se recomanda setarea
parametruluidisplay_errors la valoarea 1(TRUE) in cazul site-urilor de
productie; mesajele de eroare afisate nu sint folositoare utilizatorului. Pe
de alta parte aceasta ar contribui la marirea riscului unui atac.
A doua metoda consta in folositrea functiei ini_set, care permite unui
script sa redefineasca temporar un parametru din fisierul de configurare
[Link].
Consideram un exemplu de cod in care intentionat incercam sa citim
variabile care nu exista:
<?php
ini_set('display_errors',1);
echo "Valoarea transmisa este ".$var;
?>
In exemplul de mai sus daca variabila cu nume: "var" nu exista PHP va
afisa un mesaj de eroare de genul:
Notice: Undefined variable: var
Putem determina tipurile de erori pe care le semnaleaza PHP folosind
functia: error_reporting(). Aceasta preia o constanta care specifica
nivelul la care se afiseaza erorile.
error_reporting(E_ALL) - semnaleaza toate tipurile de erori
error_reporting(E_ALL & ~E_NOTICE) - semnaleaza toate erorile in afara
de anunturi
error_reporting(0) - dezactiveaza acesta caracteristica.
Exemplu:
<?php
ini_set('display_errors',1);
error_reporting(E_ALL & ~E_NOTICE);
echo "Valoarea transmisa este ".$_GET['orase'];
?>
- Testati acest exemplu pentru a vedea rezultatul.
Constante si tipuri de variabile
nvatati sa definiti si sa utilizati constantele
nvatati sa folositi variabilele dinamice
nvatati sa convertiti valorile dintr-un tip n altul
n aceasta lectie vom discuta despre constante si variabile dinamice.
Puteti scrie programe PHP utile si complexe fara a utiliza constante sau
variabile dinamice. Daca utilizarea constantelor poate facilita citirea
programelor dumneavoastra, variabilele dinamice au un efect contrar.
Din acest motiv, n general se recomanda evitarea variabilelor dinamice,
mai ales de catre programatorii PHP ncepatori. Totusi, va puteri afla n
situatia de a lucra la un program PHP scris de o persoana care foloseste
aceste variabile; prin urmare, trebuie sa aveti cunostinte despre
variabilele dinamice, indiferent daca le folositi sau nu n propriile
dumneavoastra programe.
1. Utilizarea constantelor
O constanta este pur si simplu o valoare care este... constanta, cu alte
cuvinte o valoare care nu se modifica, n acest sens, constantele sunt
opusele variabilelor, deoarece valoarea unei variabile se poate modifica
pe durata executiei unui program.
Pentru a defini o constanta, folositi functia define().
Sa consideram urmatorul exemplu:
define("PI", 3.14159);
- Aceasta instructiune defineste constanta "PI", atribuindu-i
valoarea 3.14159. Dupa ce a fost definita, o constanta se poate folosi n
cadrul unei expresii.
De exemplu, puteti calcula aria unui cerc dupa cum urmeaza:
$arie = PI * $raza * $raza;
- Observati ca referintele la o constanta nu folosesc simbolul dolarului.
Astfel, o constanta poate fi cu usurinta deosebita de o variabila. Multi
programatori scriu numele constantelor folosind numai majuscule, ceea
ce le face si mai simplu de identificat.
O functie conexa, defined(), poate determina daca o anumita constanta
a fost definita.
De exemplu, cu ajutorul urmatoarei instructiuni PHP puteri determina
daca fost definita constanta Pi:
echo defined("PI");
- Retineti ca numele care va fi testat este delimitat prin ghilimele duble.
Functia defined() returneaza valoarea 1 (unu) daca respectiva constanta
a fost specificata; n caz contrar, returneaza zero
In acest exemplu, instructiunea echo va afisa valoarea 1.
Pe lnga sporirea lizibilitatii programelor, constantele pot facilita
modificarea acestora.
Sa presupunem ca ati scris un program care contine multe calcule ce
folosesc valoarea 3,14159, iar ulterior ati descoperit ca trebuia sa folositi
valoarea mai exacta 3,1415926535898. Descoperirea si modificarea
fiecarei aparitii a valorii originale poate fi o activitate mare
consumatoare de timp. Dar, daca ati definit o constanta pentru
reprezentarea valorii, numarul 3,14159 va aparea o singura data n
program si va fi necesara doar o singura modificare a constantei.
Valoarea "pi" este folosita extrem de frecvent n unele calcule. Pentru
comoditate, PHP furnizeaza o functionalitate mai indicata dect definirea
unei constante cu valoarea pi, functia pi() returneaza valoarea
respectiva, cu 14 cifre semnificative (3.1415926535898).
Astfe, puteti calcula aria unui cerc folosind urmatoarea expresie:
$arie= pi() * $raza * $raza;
2. Lucrul cu variabile dinamice
Daca o constanta poate spori lizibilitatea si simplitatea modificarii
programelor, variabilele dinamice ngreuneaza ntelegerea si
posibilitatea de a opera schimbari n program.
Iata un exemplu simplu de variabila dinamica, denumita "$$film" :
<?php
$oameni_buni = 12;
$film = "oameni_buni";
echo $$film;
?>
O variabila dinamica este denumita folosind doua simboluri ale
dolarului ($$) si este asociata cu o variabila obisnuita care are un nume
similar si include un singur simbol al dolarului.
In exemplul de mai sus, variabila dinamica $$film este asociata cu
variabila obisnuita, dar cu aceasi nume, $film.
Valoarea unei variabile obisnuite da numele (fara un simbol al dolarului)
unei a doua variabile ordinare, n exemplu nostru, a doua variabila
obisnuita este $oameni_buni. Valoarea acestei a doua variabile
obisnuite este valoarea variabilei dinamice: n exemplu, aceasta este
valoarea 12. Deci valoarea variabiei dinamice $$film, si care va fi afisata
de functia "echo" este 12.
O variabila dinamica nu contine, practic, propria sa valoare. n schimb,
contine amplasamentul unde se poate gasi valoarea; cu alte cuvinte,
numele unei alte variabile.
Daca variabilele dinamice vi se par derutante, asa e, variabilele
dinamice sunt derutante. Sunt rar folosite, uneori este posibila reducerea
dimensiunilor unui program folosind una sau mai multe variabile
dinamice.
3. Lucrul cu tipuri de variabile
In lectia 2 ati invatat despre tipul variabilelor: Boolean, Integer,
Float, String, Array, Object, Resource, Null.
. O consecinta a caracterului dinamic al tipurilor de variabile din
limbajului PHP este aceea ca nu trebuie sa specificati tipul variabilelor.
PHP determina tipul variabilei n functie de tipul ultimei valori atribuite
variabilei. Cu toate acestea, caracterul dinamic al tipurilor nu va scuteste
de problemele legate de tipuri. Trebuie sa cunoasteti tipurile acceptate si
ceea ce se ntmpla cnd n cadrul expresiilor se folosesc doua sau mai
multe tipuri.
Sa luam n considerare urmatorul script PHP scurt:
$x = 1;
$y = 2.5;
$z = $x+$y;
echo $z;
- Instructiunea de atribuire care stocheaza o valoare n variabila $z este
interesanta, deoarece expresia din membrul drept include un operand
Integer (ntreg) si un operand de tip float. Ce valoare va aparea la iesire?
Raspunsul corect este 3.5, o valoare de tip float.
Cnd o expresie aritmetica foloseste mai multe tipuri de variabile, PHP
executa conversia automata a tipului. Daca unul dintre operanzi este de
tip float, PHP trateaza ceilalti operanzi ca si cum ar fi de tip float, executa
calculele si returneaza rezultatul ca valoare de tip float.
Este important sa ntelegeti faptul ca prin conversia de tip nu se modifica
tipurile variabilelor unei expresii; acestia sunt pur si simplu tratati ca si
cum ar fi fost de un alt tip.
In cadrul exemplului, variabila $x ramne de tip nteger, chiar daca PHP o
trateaza ca o valoare de tip float pentru a executa calculele.
Sirurile (variabilele de tip string) pot fi de asemenea supuse unei conversii
de tip. Sa examinam urmatorul exemplu:
$x = 1;
$y = $x+ "inca 1";
echo $y
- Aici cuvntul "inca" din sirul text este ignorat.
Valoarea afisata este 2, adica suma dintre valoarea variabilei $x si
valoarea numerica a sirului text, care este 1. Valoarea numerica si tipurile
unui sir sunt determinate prin respectarea urmatoarelor reguli:
1. Daca sirul ncepe cu o valoare numerica, valoarea sirului este data de
valoarea numerica respectiva; n caz contrar, valoarea sirului este zero.
2. Daca un punct zecimal sau un exponent (e sau E), este asociat cu valoarea
numerica, tipul variabilei rezultante este float; n caz contrar, tipul valorii
rezultante este un ntreg.
4. Conversia manuala a tipului variabilelor
Daca preferati, puteti prelua controlul conversiei tipului variabilei sau
puteti modifica tipul unei variabile. Pentru a prelua controlul conversiei
de tip, puteti converti fortat un operand de la un tip la altul, proces
cunoscut sub numele de "conversie fortata de tip" sau pur si simplu
conversie fortata.
n continuare, este dat un exemplu unei astfel de conversie de tip, unde
puteti vedea modul de efectuare a acesteia:
$x = 1;
$y = 2.5;
$z = $x + (int)$y;
echo $z
Conversia fortata de tip, si anume (int), determina tratarea
variabilei $y ca pe un ntreg (integer), iar valoarea acesteia devine 2, n
loc de 2.5, care este valoarea reala a variabilei $y. Astfel valoarea
lui $z care va fi afisata de expresia "echo" este 3.
Tabelul urmator indica si alte conversii fortate de tip care se pot folosi si
expresiile care trebuesc utiizate:
Conversie
Rezultat
fortata
(int), (integer) - Conversie fortata la ntreg
(real),
(double),
(float)
- Conversie fortata la dublu
(string)
- Conversie fortata la sir
(array)
- Conversie fortata la
tablou (matrice)
(object)
- Conversie fortata la obiect
O alta modalitate de a trata o variabila ca si cum ar fi de un tip
specificat este folosirea unor functii specifice.
Ca exemplu de utilizare a uneia dintre functiile respective, luati n
considerare si studiati urmatorul exemplu:
<?php
$x = 1.5;
$y = intval($x);
echo $x;
echo "<br />$y";
?>
Rezultatul afisat va fi:
1.5
1
Valoarea 1.5 este afisata ca valoare a variabilei $x, iar valoarea l este
afisata ca valoare a variabilei $y.
Tabelul urmator prezinta si alte functii foosite pentru a trata o variabila ca
si cum ar fi de alt tip.
Functie
Operatie
doubleval(), - Trateaza argumentul ca fiind
floatval()
de tip dublu.
intval()
- Trateaza argumentul ca fiind
de tip ntreg.
strval()
- Trateaza argumentul ca fiind
de tip string
Nici conversia normala si nici cea fortata nu modifica tipul unei
variabile. Ambele mecanisme determina tratarea variabilelor doar in
expresia respectiva ca si cum ar fi de un alt tip.
Totusi, modificarea tipului unei variabile este posibila prin utilizarea
functiei settype().
Acest procedeu este ilustrat n urmatorul exemplu:
$x = 1.5;
settype($x,"integer");
echo $x; // Va afisa valoarea 1
- Tipul variabilei $x va fi schimbat in "integer", astfel valoarea afisata a
variabilei $x este 1, deoarece fractia zecimala se pierde atunci cnd
functiasettype() converteste valoarea float la o valoare ntreaga.
Valorile posibile pentru al doilea argument al functiei settype(), si anume
argumentul care specifica tipul dorit, sunt:
"integer"
"double"
"string"
"array"
"object"
Sa ne amintim din lectia 2 ca exista o functie conexa, gettype(), care returneaza un sir
care indica tipul variabilei specificate. Scriptul urmator afiseaza "integer", care indica tipul
variabilei$x:
$x = 1;
echo gettype($x);
- O lista cu mai multe functii utile in lucru cu tipuri de variabile si valorile
lor gasiti la pagina -> Functii pentru tipuri de variabile si valori.
Instructiuni conditionale if() else
Invatati sa definiti si sa folositi valorile de tip adevarat/fals
Invatati sa ntelegeti si sa scrieti instructiunile if si else
1. Utilizarea valorilor de tip adevarat / fals
Majoritatea programelor utile nu se comporta n exact acelasi mod la
fiecare rulare a acestora, n schimb, programele iau decizii, executnd
uneori o operatie si alteori alta, n functie de circumstante.
Programele PHP iau decizii prin evaluarea unor expresii conditionale si
executa instructiuni bazate pe rezultatele acestor evaluari. Expresiile
conditionale sunt asimilate ca avnd una din doua
valori: TRUE (adevarat) sau FALSE (fals). Uneori, expresiile conditionale
se mai numesc si expresii booleene, n onoarea matematicianului care
le-a studiat, George Boole. Constanta TRUE are valoarea l,
iar FALSE are valoarea 0.
O modalitate utila de a forma o expresie conditionala consta n utilizarea
operatorilor logici pentru compararea a doua valori numerice. Sa luam
urmatorul exemplu:
$a < 1;
Aceasta expresie conditionala foloseste operatorul <, care are, n esenta,
aceeasi semnificatie ca n algebra. Expresia are valoarea TRUE daca si
numai daca valoarea variabilei $a este mai mica dect 1; n toate
celelalte cazuri, are valoarea FALSE.
Puteti forma expresii conditionale complexe prin unirea a doua expresii
conditionale cu ajutorul unui operator logic. De exemplu, expresia
urmatoare este adevarata daca ambele expresii conditionale care o
compun sunt adevarate:
$a < 1 AND $b < 1
Cu alte cuvinte, expresia este adevarata daca att variabila $a, ct si
variabila $b au valori mai mici dect 1.
PHP furnizeaza un set de asemenea operatori relationali, prezentati pe
scurt n tabelul de mai jos.
Puteti folosi operatorii logici pentru compararea sirurilor; cu toate acestea, un sir care
apare ntr-o expresie conditionala este convertit la o valoare numerica nainte de
evaluarea expresiei. Deseori, se ajunge la rezultate neasteptate, n general, valorile
sirurilor trebuie sa fie comparate folosind o functie de comparare a sirurilor; aceste functii
vor fi explicate n lectiile urmatoare.
Operatori logici
Operato
r
Descriere
$a < $b
- TRUE daca valoarea lui $a este mai mica dect
valoarea lui $b.
$a > $b
- TRUE daca valoarea lui $a este mai mare dect
valoarea lui $b.
$a >= - TRUE daca valoarea lui $a este mai mare sau egala
$b
cu valoarea lui $b
$a <= - TRUE daca valoarea lui $a este mai mica sau egala
$b
cu valoarea lui $b
$a = $b
- TRUE daca valoarea lui $a este egala cu valoarea lui
$b.
$a == - TRUE daca $a si $b sunt identice; cu alte cuvinte,
$b
daca $a si $b au acelasi tip si aceeasi valoare
$a != - TRUE daca valoarea lui $a este diferita de valoarea
$b
lui $b
$a !== - TRUE daca $a si $b nu sunt identice; cu alte cuvinte,
$b
daca $a si $b nu sunt de acelasi tip si aceeasi valoare
$x AND - TRUE daca att $x, ct si $y sunt adevarate
$y
$x &&
- TRUE daca att $x, ct si $y sunt adevarate.
$y
$x OR - TRUE daca minimum una din expresiile $x sau $y
$y
este adevarata.
$x || $y
- TRUE daca minimum una din expresiile $x sau $y
este adevarata.
$x XOR - TRUE daca numai una din expresiile $x sau $y este
$y
adevarata.
!$x
- TRUE daca $x este FALSE
NOT $x - TRUE daca $x este FALSE
Retineti ca puteti prefixa o expresie conditionala cu operatorul !, care inverseaza
valoarea "TRUE" sau "FALSE" a operandului sau.
Observati ca PHP foloseste doi operatori logici care executa aceeasi
operatie (AND si &&) respectiv (OR si ||).
Cu toate acestea, operatorii difera din punctul de vedere al precedentei caracteristica care determina ordinea n care sunt executate operatiile n
timpul evaluarii expresiilor. Operatorii && si || au o precedenta relativ
ridicata, n timp ce operatorii AND si OR au o precedenta relativ redusa.
Este la fel ca in aritmetica unde, intr-o ecuatie ca aceasta: a + b * c se
executa intai inmultirea si apoi adunarea, chiar daca ordinea lor este alta
(daca nu sunt folosite paranteze). La fel si in PHP, se pot folosi paranteze
rotunde pentru a controla ordinea executarii operatiilor.
Pentru comoditate, puteti forma expresii conditionale fara un operator
logic. De exemplu, daca $a este o variabila numerica, puteti folosi
expresia $a ca expresie conditionala. Expresia este considerata ca avnd
valoarea FALSE daca valoarea variabilei $a este zero, respectiv valoarea
TRUE daca valoarea variabilei respective este diferita de zero.
Daca folositi un sir ca expresie conditionala, expresia are valoarea FALSE
daca sirul este vid sau daca are valoarea speciala "\0", care simbolizeaza
un octet cu valoarea zero.
Similar, utilizarea unei valori nedefinite ca expresie conditionala
determina obtinerea valorii FALSE. Daca folositi un tablou sau un obiect
ca expresie conditionala, aceasta are valoarea FALSE daca tabloul sau
obiectul sunt vide (fara vreo valoare); n caz contrar, expresia are
valoarea TRUE.
2. Scrierea instructiunilor "if"
Expresiile conditionale sunt esentiale pentru scrierea instructiunilor
conditionale, prin care se iau decizii.
Una dintre cele mai simple si folosite instructiuni conditionale este
instructiunea : if.
If(conditie) {
Instructiune(1);
Instructiune(2);
..................
}
- Dupa cum se observa dupa if urmeaza o pereche de paranteze rotunde
in interiorul carora se plaseaza conditia, adica o expresie logica a carei
rezultat poate fi TRUE sau FALSE. Daca si numai daca rezultatul expresiei
logice (conditia) este TRUE se vor executa instuctiunile : Instructiune(1),
apoi Instructiune(2), etc...
Se observa ca acest set de instructiune se plaseaza intre acolade. Doar
intr-un singur caz aceste acolade nu sunt necesare si anume: in cazul in
care este scrisa doar o singura instructiune.
Daca rezultatul expresiei logice dintre paranteze rotunde este FALSE ,
setul de instructiuni dintre acolade nu se va executa, controlul
programului va trece mai departe.
Iata inca un exemplu, practic:
<?php
$numar = 12;
if ($numar > 10) {
echo "Acesta este un numar mai mare decat 10";
}
?>
- Atunci cnd este executat scriptul, instructiunea if evalueaza expresia
conditionala $numar > 10, care este adevarata (TRUE) numai daca
valoarea variabilei $numar este mai mare dect 10. Daca valoarea
variabilei $numar este mai mare decat 10, se va executa
instructiunea echo, in caz contrar programul va trece mai departe.
In general, limbajul PHP ignora spatiile albe. In mod conventional, o instructiune
asociata unei instructiuni "if" este scrisa decalat n raport cu aceasta. Acest procedeu este
recomandat deoarece prin utilizarea sa este facilitata citirea programului.
Utilizarea instructiunii "else"
Sa presupunem ca doriti sa executati o instructiune atunci cnd o
conditie este TRUE si o alta instructiune cnd conditia este FALSE.
Instructiunea elseva permite sa procedati astfel, dupa cum urmeaza:
If(conditie) {
Instructiune(1);
Instructiune(2);
..................
}
else {
Instructiune(3);
Instructiune(4);
..................
}
In acest din urma caz daca expresia logica din paranteze: conditie este
adevarata se vor executa instructiunile: Instructiune(1); Instructiune(2); ,
iar daca valoarea expresiei logice : conditie are valoarea FALSE se vor
executa instructiunile: Instructiune(3); Instructiune(4);
Instructiunea asociata unei instructiuni if sau else poate fi ea nsasi o
instructiune if. O asemenea instructiune if se numeste "instructiune if
imbricata".
Iata un exemplu de instructiune if imbricata:
<?php
$numar = 88;
if ($numar > 10) {
if ($numar > 100) {
echo "Acesta este un numar mai mare decat 100";
}
else {
echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10";
}
}
else {
echo "Acesta este un numar mic";
}
?>
Exemplul afiseaza mesajul "Acesta este un numar mai mare decat
100" daca valoarea variabilei $numar depaseste 100; n caz contrar,
daca valoarea variabilei $numar este mai mare dect 10 si mai mica
decat 100, se afiseaza mesajul "Acesta este un numar mai mic decat 100,
dar mai mare decat 10". Daca valoarea variabilei $numar este mai mica
sau egala cu 10, exemplul afiseaza mesajul "Acesta este un numar mic".
Instructiunile if imbricate pot deveni extrem de dificil de nteles daca
numarul de instructiuni si nivelul de imbricare nu sunt relativ reduse. Deci
trebuie sa le folositi cu economie.
O instructiune corelata att cu instructiunea if, ct si cu instructiunea
else, este instructiunea elseif. Cnd este folosita corect, poate fi mai
simplu de nteles dect o instructiune if imbricata, logic echivalenta cu
aceasta.
Iata un exemplu de instrutiune else if():
<?php
$numar = 88;
if ($numar > 100 ) {
echo "Acesta este un numar mai mare decat 100";
}
elseif ($numar > 10) {
echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10";
}
elseif ($numar > 1) {
echo "Acesta este un numar mic";
}
else {
echo "Acesta este un numar foarte mic";
}
?>
Exemplul extinde functionalitatea exemplului anterior, afisnd mesajul
"Acesta este un numar foarte mic" pentru valori ale variabilei $numar
mai mici sau egale cu 1.
ntr-un caz general, cu o instructiune if si cu o instructiune else poate fi
asociat un numar mult mai mare de instructiuni elseif. PHP evalueaza
expresiile conditionale n mod succesiv, pornind de la expresia
conditionala asociata instructiunii "if". PHP executa instructiunea asociata
primei expresii conditionale care are valoarea TRUE; daca nici o expresie
conditionala nu are valoarea TRUE, PHP executa instructiunea asociata cu
instructiunea else. Este permisa omiterea instructiunii else, caz n care
nu este executata nici o instructiune daca nici una din expresiile
conditionale nu are valoarea TRUE.
Instructiuni conditionale switch
Invatati sa ntelegeti si sa scrieti instructiunea switch si instructiunile conexe
acesteia: break, default.
Scrierea instructiunilor switch, break si default
In cazul in care vrem sa comparam valoarea unei singure variabile cu o
succesiune de valori, in locul instructiunii "if" putem folosi
instructiuneaswitch:
De exemplu, sa presupunem ca valoarea variabilei $numar este l, 2 sau
3, reprezentnd respectiv dimensiunile "mica", "medie" si "mare". Iata
un mic script care afiseaza dimensiunile asociate valorilor variabilei
$numar, folosind functia switch alaturi de break si default care vor fi
explicate mai jos:
<?php
switch($numar) {
case(1):
echo "mic";
break;
case(2):
echo "mediu";
break;
case(3):
echo "mare";
break;
default:
echo "Acesta nu este un cod valabil";
}
?>
- Actiunea unei instructiuni switch este determinata de valoarea unei
expresii ntregi, nu de valoarea unei expresii conditionale. Numele
variabilei este dat ntre parantezele care urmeaza dupa cuvntul
cheie switch. Acoladele delimiteaza o serie de instructiuni case si o
instructiune default optionala, fiecare dintre instructiunile cuprinse ntre
acolade putnd avea instructiuni asociate.
Cnd este executata, instructiunea switch ncearca sa stabileasca o
identitate ntre valoarea variabilei sale si valoarea asociata unei
instructiuni case. Se vor executa instructiunile asociate primei instructiuni
"case" pentru care identitatea respectiva este valabila.
Daca valoarea variabilei din instructiunea switch nu corespunde nici
uneia din valorile asociate instructiunilor case, se vor executa
instructiunile asociate instructiunii default, daca exista o asemenea
instructiune (ne este obligatorie).
Un procedeu de programare indicat consta n aceea ca fiecare
instructiune case din cadrul unei instructiuni switch sa se ncheie cu o
instructiune break.
; Instructiunea break determina ncheierea executiei instructiunii switch,
sare peste "case-urile" ramase si se executa codurile care mai sunt (daca
exista) dupa "switch". n absenta instructiunii "break", executia trece la
urmatoarea instructiune "case" sau "default", fapt nedorit n majoritatea
cazurilor.
Nu este necesar sa folositi numere ntregi consecutive n
instructiunile case ale unei instructiuni switch. Daca preferati, puteti
folosi numere ntregi non-consecutive, numere cu virgula sau siruri.
Valoarea de la "case" se poate adauga si fara paranteze, separata prin
spatiu.
- Exemplu:
<?php
$site = 'marplo';
switch($site) {
case 1:
echo '[Link]';
break;
case 'coursesweb':
echo '[Link]
break;
case 'marplo':
echo '[Link]';
break;
default: echo '[Link]';
}
?>
2. Operatorul ? :
Operatorul conditional ?:, denumit uneori "operator ternar" sau
"operator ntrebare-doua puncte", constituie o alta modalitate de a scrie
decizii n PHP.
Acest operator formeaza o expresie care se poate folosi n multe
contexte PHP. Iata sintaxa de utilizare a acestuia:
expresie-conditionala ? valoare-TRUE : valoare-FALSE
Observati cum semnul ntrebarii este separat de caracterul doua puncte
prin valoarea valoare-TRUE.
Operatorul conditional si evalueaza expresia conditionala. Daca expresia
este evaluata la valoarea TRUE, operatorul conditional returneaza
valoareavaloare-TRUE; n caz contrar, returneaza valoarea valoareFALSE.
De exemplu, sa luam n considerare urmatoarea instructiune de atribuire,
care foloseste un operator conditional:
$a = ($b > $c) ? 10 : 20;
Aceasta instructiune de atribuire compara valorile variabilelor $b si $c.
Daca valoarea variabilei $b este mai mare dect aceea a variabilei $c
(adica TRUE), atunci variabilei $a i este atribuita valoarea 10; n caz
contrar, variabilei respective i este atribuita valoarea 20.
Instructiuni repetitive for() si while()
Invatati sa ntelegeti si sa scrieti instructiunile while(), do while si for()
Scrierea instructiunilor "for"
Instructiunea for() este o instructiune bucla sau o instructiune
iterativa; cu alte cuvinte, o instructiune care executa n mod repetat
instructiunile asociate.
Sintaxa generala a instructiunii for este urmatoarea:
for(expresie1; conditie; expresie2) {
Instructiune(1);
Instructiune(2);
Instructiune(3);
.............
}
expresie1 se executa o singura data si anume la inceputul
instructiunii; conditie este o expresie logica ; instructiunea for() se
executa atita timp cat valoarea expresiei : conditie are valoarea TRUE.
De fiecare data dupa executia instructiunilor dintre acolade se
executa : expresie2.
Iata un exemplu practic de utilizare a unei instructiuni "for":
<?php
$suma = 0;
for ($n=1; $n<=3; $n++) {
$suma += $n;
echo "<br /> Suma intregilor de la 1 la $n este $suma.";
}
?>
Rezultatul afisat va fi:
Suma intregilor de la 1 la 1 este 1
Suma intregilor de la 1 la 2 este 3
Suma intregilor de la 1 la 3 este 6
n exemplu se calculeaza suma ntregilor cuprinsi ntre l si 3. Pentru
aceasta, mai nti se initializeaza variabila $suma la valoarea 0. Apoi se
executa o instructiune for() care incrementeaza n mod repetat valoarea
variabilei $suma.
Pentru a vedea cum functioneaza mecanismul acestei instructiuni, sa
examinam componentele instructiunilor for().
Instructiunea "for" include trei expresii, care apar ntre paranteze; fiecare
expresie este separata de vecina sa printr-un caracter punct si virgula(;).
Prima expresie este expresia de initializare. Aceasta se executa atunci cnd
PHP ajunge la instructiunea for(). In exemplu, expresia de initializare
atribuie valoarea variabilei $n, ($n=1) variabila denumita "variabila de
ciclare" sau "index".
A doua expresie este expresia de test. Aceasta este o expresie conditionala
care indica daca se executa sau nu corpul instructiunii, n general, face
referire la variabila de ciclare. In cadrul exemplului, expresia de test
compara valoarea variabilei $n cu valoarea 3 ($n <= 3).
Expresia de test este evaluata pentru prima data imediat dupa evaluarea
expresiei de initializare.
Cea de-a treia expresie este expresia pas. n general, aceasta modifica una
sau mai multe variabile la care se face referire n expresia test. n cadrul
exemplului, expresia pas incrementeaza valoarea variabilei $n ($n++).
Dupa care se trece la corpul instructiunii for(), aici, instructiunea $suma
+= $n si echo "Suma intregilor de la 1 la $n este
$suma."; reprezinta corpul instructiunii for.
Dupa executarea corpului functiei se verifica din nou expresia de test
(conditie) dintre paranteze, daca rezultatul este TRUE se trece mai
departe la expresia "pas" (a treia din paranteze) si mai departe la corpul
functiei for(). Dupa aia din nou la expresia de test dintre paranteze...,
pana cand rezultatul este FALSE (in exemplu nostru, $n>3).
Instructiunea for() este utila pentru numarare si executarea n mod repetat a unor
actiuni.
Scrierea instructiuni while
O instructiune while() sau do while are o singura conditie. Fara o
expresie de initializare sau o expresie pas; opereaza similar ca o
instructiune "for()". n consecinta, urmatoarele doua instructiuni sunt
echivalente:
for ( ; $i<= 3; ) { $suma += $i; }
while ($i <= 3) { $suma ++ $i; }
Instructiunea while() executa un set de instructiuni atita timp cit
valoarea expresiei "conditie" este adevarata:
Forma generala a instructiuni while() este urmatoarea :
while(conditie) {
Instructiune(1);
Instructiune(2);
Instructiune(3);
.............
}
Setul de instructiuni Instructiune(1), Instructiune(2), etc... se vor executa
atita timp cit valoarea expresiei logice "conditie" are valoarea TRUE.
Sa studiem un exemplu practic:
<?php
$n = 0;
$suma = 0;
while ($n <= 3) {
$suma = $suma +$n;
$n++;
}
echo "Suma este $suma";
?>
In scriptul de mai sus avem la inceput (in afara lui "while") $n =
0 si $suma = 0, se verifica conditia din paranteza a
functiei while() ($n<=3), cum aceasta este TRUE (deoarece la aceasta
etapa $n = 0), se trece la executarea corpului functiei unde : $suma =
$suma + $n si $n++ (adica $n = $n + 1), astfel acum $n va fi egal cu 1,
se verifica din nou conditia din paranteze, care este TRUE ($n fiind acum
egal cu 1), se executa iar corpul functiei..., si tot asa se executa aceasta
"bucla" pana cand la verificarea conditiei din paranteze rezultatul este
FALSE, in acest moment se incheie executia functiei while() si se trece
mai departe la urmatoarea functie (in cazul nostru: echo "Suma este
$suma";, unde dupa executia functiei while() $suma a devenit egala cu
6).
In browser va aparea urmatorul rezultat:
Suma este 6
Scrierea instructiuni do while
Diferenta dintre instructiunea while() si instructiunea do while este
urmatoarea: daca la instructiunea while() se verifica intai conditia si
numai daca rezultatul este TRUE se trece la executarea corpului functiei,
in cazul functiei do while intai se executa corpul functiei si dupa aceea
se verifica conditia. De la do while corpul functiei va fi executat cel
putin o singura data, indiferent de rezultatul conditiei.
Forma generala a instructiuni do while este urmatoarea :
do {
Instructiune(1);
Instructiune(2);
Instructiune(3);
.............
} while(conditie);
Iata exemplul prezentat la functia while(), de data aceasta folosind
functia do while :
<?php
$n = 0;
$suma = 0;
do {
$suma = $suma +$n;
$n++;
} while ($n <= 3);
echo "Suma este $suma";
?>
Rezultatul va fi acelasi: "Suma exte 6".
n general, este bine sa fiti prudent si sa folositi instructiunea while(), care evalueaza o
conditie de test nainte, de executarea corpului acesteia. Astfel, se evita executarea eronata
a corpului buclei.
Utilizare matrice - Array
nvatati modul de utilizare a matricelor pentru stocarea mai multor valori
nvatati cum sa accesati datele unei matrice (tablou)
Parcurgerea unui Array secvential
1. Utilizarea matricelor
Deseori este convenabila stocarea mai multor valori ntr-o variabila. O
asemenea variabila se numeste matrice (Array sau "tablou"), iar
valorile individuale se numesc elementele matricei. Aici, "matrice",
"Array" sau "tablou" reprezinta acelasi lucru (in varianta
engleza: Array), fapt pentru care vom folosi orcare dintre aceste
denumiri.
Fiecare element al unei matrici are doua elemente
importante: cheia si valoarea elementului.
Matricele pot fi create folosind doua medode principale:
1 - utilizand direct instructiunile de atribuire
2 - folosind sintaxa array() despre care am vorbit in Lectia 2 despre tipul
variabilelor.
1. Crearea de matrice folosind functia de atribuire
Pentru a crea o matrice, atribuiti unui element al matricei o valoare si o
cheie. De exemplu, urmatoarea instructiunea de atribuire:
$clasa[1] = "geometrie";
creeaza un tablou denumit "$clasa" si un element cu valoarea
"geometrie" identificat prin cheia "1".
Pentru a stoca n matrice o a doua valoare, puteti folosi urmatoarea
instructiune de atribuire:
$clasa[2] = "algebra";
Pentru a obtine acces la un element al matricei, specificati numele
matricei si valoarea cheii. De exemplu, instructiunea de atribuire
$clasa_mate = $clasa[1];
Atribuie valoarea "geometrie" variabilei $clasa_mate.
Cheile folosite pentru identificarea elementelor unei matrice nu trebuie
sa fie obligatoriu numere consecutive; nici macar nu trebuie sa fie
numere. De exemplu, iata instructiuni de atribuire care creeaza o
matrice ce stocheaza preferinte n materie de fructe:
$preferinte[Nelu] = "cirese";
$preferinte[Radu] = "mere";
$preferinte[Gabi] = "pere";
2. Crearea de matrice folosind sintaxa array()
Dincolo de utilizarea instructiunilor de atribuire, cealalta modalitate
principala de creare a unui tablou PHP consta n utilizarea
functiei array(). Iata un exemplu simplu, care creeaza un tablou avnd
drept chei valori ntregi consecutive:
$limbaje = array("Perl", "PHP", "Python");
Deoarece valoarea cheilor nu a fost specificata, acestea vor fi automat
trecute de program ca numere intregi consecutive, incepand de la "0"
(prima cheie va avea valoarea '0', a doua cheie va avea valoarea '1', ...)
Aceasta instructiune creeaza o matrice care contine urmatoarele
asocieri:
0 => Perl
1 => PHP
2 => Python
Daca doriti sa asociati unei valori o anumita cheie, puteti folosi
operatorul =>, astfel:
$limbaje = array(10=>"Perl", "PHP", "Python");
Aceasta instructiune creeaza urmatoarea matrice:
10 => Perl
11 => PHP
12 => Python
Ca si n cazul utilizarii unei instructiuni de atribuire pentru crearea unei
matrice valorile cheilor nu trebuie sa fie consecutive si nici macar ntregi:
$limbaje = array("PHP"=>"Ridicat", "Python"=>"Mediu",
"Perl"=>"Redus");
Aceasta instructiune creeaza urmatoarea matrice:
PHP => Ridicat
Python => Mediu
Perl => Redus
2. Matrici multi-dimensionale
Este posibil ca un element al matricei sa fie de asemenea o matrice. In
acest caz avem de-a face cu o matrice multi-dimensionala.
Sa luam un exemplu practic :
<?php
$multiDimArray[firstLine] = array(1=>10, 2=>20, "a"=>"alpha");
$multiDimArray["nextLine"] = array(1=>20, 2=>40, "b"=>"beta");
echo
echo
echo
echo
echo
?>
"<br
"<br
"<br
"<br
"<br
/>".$multiDimArray["firstLine"][1];
/>".$multiDimArray["nextLine"][1];
/>".$multiDimArray["firstLine"][2];
/>".$multiDimArray["firstLine"]["a"];
/>".$multiDimArray["nextLine"]["b"];
Sau putem scrie acelasi script si astfel (rezultatul e acelasi) :
<?php
$multiDimArray = array("firstLine"=>array(1=>10, 2=>20, "a"=>"alpha"),
"nextLine"=>array(1=>20, 2=>40, "b"=>"beta"));
echo
echo
echo
echo
echo
?>
"<br
"<br
"<br
"<br
"<br
/>".$multiDimArray["firstLine"][1];
/>".$multiDimArray["nextLine"][1];
/>".$multiDimArray["firstLine"][2];
/>".$multiDimArray["firstLine"]["a"];
/>".$multiDimArray["nextLine"]["b"];
Rezultatul afisat va fi urmatorul :
10
20
20
alpha
beta
In exemplul de mai sus am declarat un array cu 2 linii si 3 coloane.
Prima linie este identificata de array-ul cu numele "fisrtLine", iar ce-a dea doua linie este identificata de "nextLine".
Observati de asemenea foloasirea in functia "echo" a operatorului de concatenare "."
impreuna cu "<br />" (care este un element din XHTML), pentru ca la afisarea in browser
fiecare rezultat al functiei "echo" sa fie trecut pe o linie noua. In caz contrar rezultatele ar
fi fost pe aceeasi linie : 10 20 20 alfa beta
3. Accesul la datele dintr-un array
Cnd ati stocat date ntr-un tablou, puteti obtine acces la valoarea unui
element al tabloului sau i puteti modifica valoarea prin intermediul cheii
asociate elementului.
De exemplu, sa presupunem ca folositi urmatoarele instructiuni pentru a
crea un tablou:
$x = array(1=>10, 2=>100, 3=>1000);
Puteti obtine acces la valoarea asociata cheii 2 prin intermediul unei
instructiuni ca aceasta:
$y = 3*$x[2];
Similar, puteti modifica valoarea asociata cheii 3 prin intermediul unei
instructiunu ca aceasta:
$x[3] = 101;
4. Parcurgere Array numeric
Un Array ale carui chei sunt valori ntregi consecutive se numeste
"Array numeric" (sau secvential).
n general, valoarea cea mai mica a unei chei dintr-un tablou numeric
este zero; totusi, puteti crea array numeric incepand cu valoarea 1 sau
orice alta valoare ntreaga ca valoare minima a cheii.
n cazul n care cunoasteti valoarea minima a cheii unui tablou
secvential, puteti parcurge tabloul folosind o bucla for. Pentru aceasta,
initializati variabila de bucla la valoarea cea mai redusa a cheii. Folositi
functia count() pentru a forma expresia de test (conditia) a buclei.
Functia count()returneaza numarul elementelor dintr-un tablou.
Iata un exemplu simplu
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
echo "<br />$i => $limbaje[$i]";
}
?>
Prima variabila $imbaje creeaza tabloul.
Cea de-a doua variabila $limita foloseste instructiunea count() pentru a
obtine numarul elementelor din tablou.
Instructiunea for foloseste variabila bucla $i pentru a parcurge iterativ
(element cu element) tabloul; corpul instructiunii include o
instructiune echo care afiseaza cheia si valoarea fiecarui element din
tablou.
Datele de iesire vor fi astfel:
0 => Perl
1 => PHP
2 => Python
Sa ne concentram asupra problemei de a determina daca un tablou
contine o anumita valoare.
Iata un exemplu:
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$cauta = PHP;
// se cauta in tabloul $limbaje valoarea $cauta
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
echo "<br />Determinarea unei identitati cu $limbaje[$i]";
if ($cauta == $limbaje[$i]) {
echo "<br />$cauta este un limbaj excelent.";
}
}
?>
Prima variabila $imbaje creeaza tabloul n care se va cauta.
Cea de-a doua instructiune atribuie valoarea "PHP" variabilei $cauta; (n
exemplu, se cauta n tablou valoarea stocata n variabila $cauta).
Dupa comentariu (care incepe cu //), urmatoarea instructiune obtine
numarul elementelor din tablou si stocheaza aceasta valoare n
variabila $limita.
Instructiunea for functioneaza ca mai nainte; de data aceasta nsa,
corpul sau contine alte instructiuni si se executa o alta operatie. O
instructiune echoafiseaza valoarea fiecarui element al tabloului pe
masura ce parcurgerea tabloului avanseaza. Instructiunea if testeaza
fiecare element si afiseaza un mesaj daca valoarea elementului este una
si aceeasi cu valoarea variabilei $cauta.
Iata rezultatul rularii exemplului:
Determinarea unei
Determinarea unei
PHP este un limbaj
Determinarea unei
identitati cu Perl
identitati cu PHP
excelent.
identitati cu Python
Incepand cu versiunea PHP 5.4 a fost introdus un nou mod de a defini
variabile array, folosind o sintaxa scurta.
Ex.:
$arr = [];
// array gol, in loc de array();
$arr = [1, 2, 3, 4];
// array numeric
$arr = ['eng'=>'[Link]', 'ro'=>'[Link]', 'num'=>8];
asociativ
// array
- Array-ul creat cu aceasta sintaxa poate fi accesat, modificat si parcurs
ca orice array.
Instructiunea break
Observati ca parcurgerea continua chiar si dupa gasirea valorii
cautate.
Cnd se cauta ntr-un tablou, executia cautarii poate fi oprita dupa
gasirea elementului dorit; continuarea parcurgerii in Array nu face dect
sa iroseasca resursele calculatorului, fara a afecta rezultatele operatiei.
Pentru a opri executia unei parcurgeri, puteti folosi instructiunea break,
care determina ncheierea imediata a buclei care o contine.
Iata cum se poate revizui exemplul anterior, astfel nct sa includa o
instructiune break:
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$cauta = PHP;
// se cauta in tabloul $limbaje valoarea $cauta
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
echo "<br />Determinarea unei identitati cu $limbaje[$i]";
if ($cauta == $limbaje[$i]) {
echo "<br />$cauta este un limbaj excelent.";
break;
}
}
?>
Acum, dupa stabilirea unei identitati, instructiunea break provoaca
sistarea buclei for.
Iata datele de iesire rezultate, care acum omit examinarea inutila a
elementului tabloului asociat cu limbajul "Python":
Determinarea unei identitati cu Perl
Determinarea unei identitati cu PHP
PHP este un limbaj excelent.
Instructiunea continue
O instructiune corelata cu instructiunea break este continue.
Instructiunea continue opreste secventa curenta a buclei, determinnd
evaluarea imediata a expresiilor de incrementare si de test.
Ca un exemplu, sa presupunem ca doriti sa cautati n tabloul $limbaje
pentru a determina numarul limbajelor care au nume scurte, adica nume
alcatuite din maximum 4 caractere. Iata un exemplu care executa
aceasta prelucrare a datelor:
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$scurt = 0;
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
$n = strlen($limbaje[$i]);
echo "<br />$limbaje[$i] are $n caractere lungime";
if ($n > 4) continue;
$scurt++;
}
echo "<br />Au fost gasite $scurt limbaje cu nume scurte.";
?>
O instructiune de atribuire stabileste valoarea initiala a variabilei $scurt la
zero, folosita pentru a numara numele scurte gasite.
Instructiunea for se aseamana celor folosite anterior. Corpul acestei
instructiuni difera, desigur, de cele folosite anterior. Valoarea variabilei $n
este stabilita ca fiind egala cu numarul caracterelor care compun numele
limbajului, folosind functia strlen(), care calculeaza lungimea unui sir.
Daca instructiunea if stabileste ca elementul curent al tabloului face
referire la un limbaj cu nume lung, se executa instructiunea continue.
Instructiunea continue determina trecerea parcurgerii la urmatorul
element din tablou, fara a mai executa expresia "$scurt++"; daca nu au
mai ramas elemente n tablou, bucla for si ncheie executia.
La finalizarea parcurgerii, o instructiune echo afiseaza numarul numelor
scurte de limbaje gasite n tablou. Iata rezultatul:
Perl are 4 caractere lungime
PHP are 3 caractere lungime
Python are 6 caractere lungime
Au fost gasite 2 limbaje cu nume scurte.
- O lista cu 37 functii utile in lucrul cu Array gasiti la pagina -> Functii
pentru Array
Utilizare Array (matrice) - (2)
Part. 2 Creare tabel HTML cu date din Array
Parcurgerea unui Array asociativ
Lucrul cu functii lista
Sortarea matricelor
Transformarea matricelor in siruri si a sirurilor in matrice (array)
1. Parcurgerea unui Array asociativ
In lectia precedenta a fost prezentata modalitatea de citire a
elementelor din matrice secventiala - adica matrice ale caror chei sunt
numere intregi consecutive.
Tablourile de date pot avea si elemente ale caror chei pot fi numere
aleatoare sau chiar cuvinte, aceste matrici se numesc "matrici
asociative" (non-secventiale).
Pentru citirea datelor dintr-un Array asociativ se poate folosi
instructiunea foreach care simplifica parcurgerile de acest gen.
Instructiunea foreach are urmatoarea forma generala:
foreach (tablou as $cheie => $valoare) {corp}
- Instructiunea parcurge n mod iterativ (element cu element) tabloul
denumit "tablou", stabilind valori adecvate pentru valorile variabilelor
"$cheie" si "$valoare" aferente fiecarui element al tabloului.
Iata un exemplu simplu:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
foreach ($limbaje as $index => $limbaj) {
// parcurge iterativ tabloul
echo "<br />$index =>$limbaj";
}
?>
- Remarcati ca instructiunea echo face pur si simplu referire la valorile
variabilelor $index si $limbaj, carora li se atribuie n mod automat valorile
cheii, respectiv elementului curent.
10 =>Perl
20 =>PHP
21 =>Python
Cateodata este nevoie sa parcurgem datele unui tablou multidimensional.
Pentru a parcurge matricea, folositi instructiuni foreach imbricate:
Pentru a invata modul de parcurgere a unui Array multi-dimensional, sa
studiem urmatorul exemplu:
<?php
$date = array("PHP"=>array("simplu", "popular"), "Python"=>array("simplu",
"nepopular"), "Pearl"=>array("dificil", "popular"));
foreach ($date as $limbaj => $valoare) {
foreach($valoare as $cheie =>$caracteristica) {
echo "<br />$limbaj : $caracteristica";
}
}
?>
- Instructiunea foreach exterioara obtine cate un Array asociat cu fiecare
limbaj; a doua instructiune foreach, interioara, parcurge fiecare Array
obtinut de prima instructiune foreach.
Iata rezultatul:
PHP : simplu
PHP : popular
Python : simplu
Python : nepopular
Pearl : dificil
Pearl : popular
2. Lucrul cu functii lista
n afara de modalitatile de parcurgere a matricelor, PHP ofera
numeroase functii care va permit traversarea tablourilor, deplasndu-va
nainte sau napoi prin elementele acestuia.
Prima dintre aceste functii este current(), care returneaza valoarea
curenta a tabloului. Functia current() foloseste un pointer intern de
tablou, pe care PHP l creeaza pentru fiecare tablou. (Cnd creati un
tablou, pointerul intern de tablou este configurat astfel nct sa faca
referire la primul element al tabloului).
Functiile next() si prev() modifica pointerul intern al tabloului si se pot
folosi alaturi de functia current() pentru a parcurge un tablou.
Functia next(), asa cum i arata si numele, modifica pointerul intern al
tabloului astfel nct acesta sa faca referire la urmatorul element, n timp
ce functia prev() modifica pointerul intern al tabloului astfel nct acesta
sa faca referire la elementul anterior.
Iata un exemplu care prezinta modul de operare al functiilor mentionate:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
$curent = current($limbaje);
echo "<br />functia current() a returnat $curent";
$urmator = next($limbaje);
echo "<br />functia next() a returnat $urmator";
$urmator = next($limbaje);
echo "<br />functia next() a returnat $urmator";
$anterior = prev($limbaje);
echo "<br />functia prev() a returnat $anterior";
?>
Iata datele de iesire ale exemplului:
functia
functia
functia
functia
current() a returnat Perl
next() a returnat PHP
next() a returnat Python
prev() a returnat PHP
Observati modul n care sunt utilizate functiile prev() si next() pentru deplasarea napoi,
respectiv nainte, n interiorul tabloului.
3. Functia key()
Functia key() este corelata cu functia current(). Daca
functia current() returneaza valoarea asociata elementului
curent, functia key() returneaza cheia asociata elementului curent.
Iata un exemplu care ilustreaza modul de operare al acestei functii:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
$curent = current($limbaje);
$cheie = key($limbaje);
echo "<br />functia current() a returnat $curent";
echo "<br />functia key() a returnat $cheie";
?>
Iata datele de iesire ale exemplului:
functia key() a returnat 10
4. Functia each()
O alta functie utila n parcurgerea tablourilor este each().
Functia each() returneaza perechea "cheie-valoare" care se afla la
pozitia curenta din tabloul specificat. Perechea "cheie-valoare" este
returnata sub forma unui Array asociativ cu patru elemente, dupa cum
urmeaza:
Che
ie
Valoare
- Componenta cheie a perechii cheievaloare curenta
- Componenta valoare a perechii cheievaloare curenta
key - Componenta cheie a perechii cheie-
valoare curenta
valu - Componenta valoare a perechii cheiee valoare curenta
- Observati ca puteti folosi valoarea cheie "0" sau "key" pentru a obtine
accesul la componenta cheie a perechii "cheie-valoare"; similar, puteti
folosi valoarea cheie "1" sau "value" pentru a obtine accesul la
componenta valoare a perechii "cheie-valoare".
Pentru a intelege mai bine cum se foloseste functia each(), studiati
exemplul urmator:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
$fiecare = each($limbaje);
$zero = $fiecare[0];
$unu = $fiecare[1];
$cheie = $fiecare['key];
$valoare = $fiecare['value];
echo
echo
echo
echo
?>
"<br
"<br
"<br
"<br
/>zero=$zero";
/>unu=$unu";
/>cheie=$cheie";
/>valoare=$valoare";
Iata datele de iesire ale exemplului:
zero=10
unu=Perl
cheie=10
valoare=Perl
5. Functia list()
O alta functie utila n lucrul cu tablouri este functia list(), aceasta va
permite sa atribuiti valori la numeroase variabile n cadrul unei
instructiuni.
Functia list() este deseori folosita cu functia each(), deoarece
functia list() faciliteaza accesul separat la cheia si la valoarea returnate
de functia each().
Forma generala de utilizare a functiei list() este urmatoarea:
list($var1, $var2, .., $varn) = valoare_tablou;
Fiecare dintre variabilele specificate, de la $var1 la $varn, primeste o
valoare din tabloul "valoare_tablou".
ntr-un fel, functia list() este opusa functiei array(), deoarece
functia list() mparte un tablou ntr-o serie de valori scalare, n timp ce
functia array()construieste un tablou dintr-o serie de valori scalare.
Iata un exemplu care ilustreaza modul de utilizare a functiei list():
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
list($cheie, $valoare) = each($limbaje);
echo "<br />cheie = $cheie, valoare = $valoare";
$urmator = next($limbaje);
echo "<br />urmator = $urmator";
?>
Iata datele de iesire ale exemplului:
cheie = 10, valoare = Perl
urmator = Python
PHP contine peste 40 de functii pentru lucrul cu tablourile. De exemplu,
functia array_search() faciliteaza cautarea ntr-un tablou.
Pentru informatii despre aceasta functie si despre alte functii utilizate n lucrul cu tablouri,
vizitati site-ul [Link].
6. Sortarea tablourilor
Sortarea reprezinta o alta operatie frecvent aplicata tablourilor. PHP
furnizeaza o suita de functii care faciliteaza sortarea unui tablou.
De exemplu, un tablou poate fi creat dupa cum urmeaza:
$limbaje = array(10=>"Perl", 20=>"PHP",
21=>"Python");
Apoi, doriti sa sortati tabloul n ordine alfabetica, in functie de numele
limbajului de programare.
Pentru aceasta, pur si simplu invocati functia sort():
sort($limbaje);
Dupa sortare, continutul tabloului apare in ordinea cum se poate vedea
mai jos:
0 => PHP
1 => Perl
2 => Python
Observati ca secventa de sortare sau secventa de aranjare (cum este
numita uneori) este sensibila la diferenta ntre majuscule si minuscule.
Deoarece litera "H" mare este sortata inaintea literei "e" mic, PHP apare
nainte de Python n datele de iesire sortate.
Iata un exemplu practic de folosire a functiei sort() :
<?php
$arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan');
sort($arr);
foreach($arr as $key=>$nume) {
echo "<br />Cheie=$key Valoare=$nume";
}
?>
Rezultatul afisat este urmatorul :
Cheie=0
Cheie=1
Cheie=2
Cheie=3
Valoare=Avram
Valoare=Cristian
Valoare=Dan
Valoare=Popescu
- Se observa ca instructiunea sort($arr) sorteaza matricea $arr dupa
campul valoare (oridine alfabetica).
- Observam de asemenea ca valorile campului cheie a fost alterata, fara
sa conteze valoarea sau ordinea cheilor.
Daca dorim sa sortam in ordine inversa alfabetic, folosim functia rsort()
Iata acelasi exemplu, da cu functia rsort()
<?php
$arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan');
rsort($arr);
foreach($arr as $key=>$nume) {
echo "<br />Cheie=$key Valoare=$nume";
}
?>
Acum rezultatul afisat este urmatorul :
Cheie=0
Cheie=1
Cheie=2
Cheie=3
Valoare=Popescu
Valoare=Dan
Valoare=Cristian
Valoare=Avram
- Se observa ca si in acest caz au fost alterate valorile initiale ale cheilor.
Pentru a sorta matricea "$arr" pastrand corelarea initiala dintre valori si
cheile corespunzatoare se folosesc functiile asort(),
respectiv arsort(). Incercati-le singuri.
In afara de acestea mai sunt si alte functii utile pentru sortarea
tablourilor.
Iata un tabel care prezinta functiile folositoare pentru sortarea unui
tablou, impreuna cu rezultatul aplicarii fiecarei functii.
Vom lua ca model pentru exemplificare urmatoarea matrice:
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
Funct
ie
Operatia efectuata
Rezultat
sort( - Sortarea unui tablou n functie de valoare, in ordine
) alfabetica, fara sa se tina cont de cheile initiale
0 => PHP
1 => Perl
2 =>
Python
- Sortarea unui tablou n functie de valoare, in ordine
asort
alfabetica, pastrand corelarea initiala dintre valori si cheile
()
corespunzatoare
20 =>
PHP
10 =>
Perl
21 =>
Python
0 =>
- Sortarea unui tablou n functie de valoare, in ordine invers Python
rsort
alfabetica, fara sa se tina cont de cheile initiale
1 => Perl
2 => PHP
arsor - Sortarea unui tablou n functie de valoare, in ordine invers
21 =>
t alfabetica, pastrand corelarea initiala dintre valori si cheile Python
corespunzatoare
10 =>
Perl
20 =>
PHP
- Sortarea unui tablou n functie de cheie, in ordine
ascendenta
10 =>
Perl
20 =>
PHP
21 =>
Python
krsor - Sortarea unui tablou n functie de cheie, in ordine
t descendenta
21 =>
Python
20 =>
PHP
10 =>
Perl
ksort
O modalitate de a executa o cautare fara sensibilitate la diferenta ntre
majuscule si minuscule ar fi utilizarea functiei natcasesort(), care
sorteaza un tablou folosind o ordine care nu este sensibila la diferenta
ntre majuscule si minuscule.
O alta modalitate consta n a utiliza functia usort() sau una dintre
functiile sale conexe, n speta uksort() si uasort().
Functia usort() sorteaza valorile din tablou si returneaza un tablou
secvential; functia uksort() sorteaza cheile tabloului, iar
functia uasort() sorteaza un tablou asociativ.
De exemplu, urmatoarele instructiuni creeaza un tablou si l sorteaza
ntr-o maniera insensibila la diferenta ntre majuscule si minuscule:
$limbaje = array("Perl", "PHP", "Python");
usort($limbaje, "strcmpcase");
foreach($limbaje as $key=>$nume) {
echo "<br />$key => $nume";
}
Functia strcmpcase() este o functie din biblioteca PHP care compara
doua siruri fara a tine cont de majuscule sau minuscule. Functia
returneaza o valoare negativa daca primul sir este mai mic dect al
doilea, zero daca sirurile sunt identice, respectiv o valoare pozitiva daca
primul sir este mai mare dect al doilea.
Rezultatul va fi :
0 => Perl
1 => PHP
2 => Python
Pentru mai multe informatii despre functia usort() si despre functiile sale
conexe, examinati site-ul [Link]
Transformarea sirurilor in matrice si invers
PHP pune la dispozitia utilizatorilor functii pentru conversia intre siruri
si matrice. Acestea pot fi utile in situatii in care valoarea matricelor
trebuie memorate in baza de date.
Pentru a transforma un sir intr-o matrice folosim functia explode().
Sintaxa aceste functii este:
$matrice = explode(" ", $sir);
- In loc de spatiul dintre (" "), ca indiciu de separare, poate fi scris orice
caracter; dupa cum se doreste impartirea sirului.
Iata un exemplu:
<?php
$sir = "Popescu Avram Cristian Dan";
$matrice = explode(" ",$sir);
foreach($matrice as $key=>$nume) {
echo "<br />Cheie = $key Valoare = $nume";
}
?>
Acest cod va produce urmatorul rezultat:
Cheie
Cheie
Cheie
Cheie
=
=
=
=
0
1
2
3
Valoare
Valoare
Valoare
Valoare
=
=
=
=
Popescu
Avram
Cristian
Dan
Pentru a transforma o matrice intr-un sir, folosim functia implode().
Sintaxa aceste functii este:
$sir = implode(" ", $matrice);
- In loc de spatiul dintre (" "), ca semn de separare a elementelor in sir,
poate fi scris orice caracter; dupa cum se doreste crearea sirului.
In continuare, pentru exemplificare, folosind exemplul de mai sus, sortam
matricea "$matrice" alfabetic si apoi transferam matricea intr-un alt sir ,
de aceasta data sortat (Observati folosirea caracterelor ( \" ) in
expresia echo, pentru ca la iesire rezultatul sa contina ghilimele):
<?php
$matrice = array("Popescu", "Avram", "Cristian", "Dan");
sort($matrice);
$sir = implode(" - ",$matrice);
echo "<br />Sirul rezultat : \"$sir\"";
?>
Acest cod va produce urmatorul rezultat:
Sirul rezultat : "Avram - Cristian - Dan - Popescu"
Part. 2 Creare tabel HTML cu date din Array
- O lista cu mai multe functii utile in lucrul cu Array gasiti la pagina
-> Functii pentru Array
Utilizarea functiilor
nvatati sa apelati functiile
nvatati sa atribuiti unei variabile numele unei functii
nvatati sa ascundeti mesajele de eroare generate n timpul executiei unei
functii
nvatati sa folositi date si scripturi aflate n fisierele externe
nvatati sa definiti propria functie
Am folosit pana acum de mai multe ori termenul de functii. In cadrul
acestei lectii veti nvata mai multe despre utilizarea functiilor si despre
modul de definire a propriilor dumneavoastra functii.
Functiile reprezinta secvente de cod care sunt apelate foarte frecvent in
cadrul codului PHP. Folosirea intensiva a functiilor contribuie la o
structurare mai buna a codului; ideea este ca o problema complexa sa o
divizam in mai multe sub-probleme, fiecare astfel de subproblema sa fie
executata in cadrul unei functii.
Pe de alta parte folosirea frecventa a functiilor duce la micsorarea
cantitatii de cod scris; prin urmare vom avea un cod care se executa mai
eficient.
1. Utilizarea unei functii
Pentru a folosi o functie, scrieti numele functiei, urmat de o pereche de
paranteze. De exemplu, functia rand(), care genereaza un numar ntreg
aleator, poate fi apelata astfel:
rand()
Majoritatea functiilor preiau argumente, reprezentnd valori, de intrare
care influenteaza operarea si rezultatul functiei.
Pentru a specifica argumente, acestea se insereaza ntre paranteze; daca
specificati mai mult de un argument, fiecare argument trebuie separat de
vecinul sau printr-o virgula.
Argumentul unei functii poate fi o valoare literala, o variabila sau o
expresie.
Unele functii PHP au argumente optionale, care pot fi specificate sau
omise, n conformitate cu intentiile dumneavoastra. De exemplu,
functia rand() are doua argumente optionale. Primul argument al functiei
indica valoarea ntreaga aleatoare cea mai mica pe care o va returna
functia; al doilea argument indica valoarea cea mai mare. Daca omiteti
ambele argumente, functia returneaza o valoare cuprinsa ntre 0 si cel
mai mare rezultat posibil.
Puteti folosi valoarea returnata de o functie ntr-o expresie, astfel valoarea
va fi accesibila n mod repetat fara a se invoca functia de mai multe ori
Iata un exemplu in care functia rand() returneaza o valoare aleatoare
cuprinsa intre 1 si 500, atribuind valoarea unnei variabile "$nr" :
$nr = rand(1, 500);
echo $nr;
Cnd se produce o eroare n timpul executiei unei functii, PHP genereaza
mesaje de eroare. Uneori, asemenea mesaje de eroare sunt nedorite. n
acest caz, puteti suprima generarea mesajelor de eroare prin adaugarea
in fata numelui functiei a caracterului @.
De exemplu,, pentru a suprima mesajele de eroare care pot aparea n
timpul executiei functiei "f()", scriem aceasta functie dupa cum urmeaza:
y = @f(x);
Totusi, indicat este sa scrieti scripturi care sa nu genereze erori, ascunderea lor nu
rezolva problema ce cauzeaza eroarea.
O functie utila, recomandata a fi folosita in script-uri este
functia isset() si este cel mai des folosita cu "if()".
isset() preia ca argument de obicei o variabila si arata daca aceasta a
fost sau nu setata.
De exemplu: isset($nr)
- Functia returneaza TRUE daca variabila "$nr" are setata o valoare
(diferita de NULL), in caz contrar returneaza FALSE.
Aceasta functie este foarte utila in determinarea caror comenzi sa fie
executate in functie daca o anumita variabila a fost setata sau nu. Previne
aparitia unor erori care apar in cazuri de variabile nule si ajuta si la
securitate.
De exemplu, sa presupunem ca avem un cod PHP care vrem sa fie
executat numai daca prin adresa URL o fost transmisa o variabila "id",
adica o adresa de forma [Link]
id=un_id, folosim functia isset() astfel:
<?php
if (isset($_GET['id'])) {
// Se executa codul dorit
}
?>
- $_GET['id'] preia valoarea lui "id" din URL, iar functia isset() verifica
daca aceasta valoare exista (daca in URL este "id=ceva"). Daca aceasta
exista, returneaza TRUE iar functia "if", avand astfel valoarea TRUE, va
executa codul dintre acoladele ei.
Functia isset() este utila si pentru situatii de verificarii a inexistentei unei variabile, prin
adaugarea caracterului (!) in fata ei. Astfel daca o anumita variabila rezulta a nu fi setata,
ii atribuim o valoare sau executam un anume cod special pt. asta.
Exemplu:
if (!isset($_GET['id'] {
die('Pagina apelata este inaccesibila.');
}
2. Utilizarea fi sierelor incluse
Functiile PHP va permit sa obtineri accesul la programe PHP scrise
anterior, create ntr-un alt fisier extern.
Pentru aceasta puteti folosi functia require(), care are urmatoarea
forma:
require("nume_fisier")
Cnd este ncarcat un script PHP care contine o instructiune require,
continutul fisierului specificat este inserat si executat n script, nlocuind
instructiunea require.
De exemplu, sa presupunem ca realizam un site in PHP care este alcatuita
din mai multe pagini, iar fiecare pagina contine in partea de sus acelasi
cod HTML. In loc sa scriem de fiecare data, pentru fiecare pagina, acelasi
cod HTML, il scriem o singura data intr-un fisier separat (de exemplu
"[Link]") iar in paginile unde vrem sa fie inclus codul HTML folosim
functia require()
Prin insertia instructiunii la nceputul scriptului din fiecare pagina PHP, ca
in exemplu urmator:
<?php
require("[Link]");
?>
- cu aceasta determinati programul PHP sa includa continutul fisierului
"[Link]" ca si cum continutul respectiv ar face parte din acel script.
Acest procedeu poate simplifica ntretinerea site-ului, deoarece
informatiile standard pot fi tinute ntr-un singur fisier, ceea ce le face usor
de localizat si de modificat.
O alta functie, similara instructiunii require este functia include(). Spre
deosebire de functia require() care introduce datele din fisierul extern
intocmai cum sunt scrise, functia include() este o instructiune
executabila ce determina evaluarea scriptului PHP din fisierul extern si
codul acestuia este executat ca si cum ar fi aparut n textul scriptului
unde este inclus.
Sintaxa functiei include() este urmatoarea:
include("nume_fisier.php");
Functia corelata require_once() asigura faptul ca fisierul specificat este inclus o
singura data ntr-un script dat. n cazul n care creati fisiere externe care si ele folosesc
instructiunea requirepentru a include continutul altor fisiere externe, puteti gasi
instructiunea require_once utila.
3. Defi nirea unei functii
n afara de a utiliza functiile din biblioteca de functii a limbajului PHP,
va puteti defini si folosi propriile functii.
Pentru a defini o functie, in PHP functiile incep intotdeauna cu
declaratia: function, ca in exemplul urmator:
function nume_functie(nume_argument) {
Aici se insereaza corpul functiei
}
Cuvntul cheie "function", "numele_functiei" si "nume_argument"
alcatuiesc antetul functiei. Termenul de corp al functiei se refera la
instructiunile incluse ntre acolade care urmeaza dupa antetul functiei.
Instructiunile din corpul functiei sunt executate atunci cnd functia este
apelata.
Numele functiilor nu prezinta sensibilitate la diferenta ntre majuscule si
minuscule; ca atare, "f()" si "F()" reprezinta referiri la aceeasi functie.
Daca doriti sa definiti o functie care nu are argumente, puteti omite
"nume_argument"; daca doriti sa definiti o functie cu mai multe
argumente, puteti include argumente suplimentare dupa
"nume_argument", fiecare argument fiind separat de vecinul sau printr-o
virgula. Parantezele si numele argumentelor incluse ntre acestea poarta
numele de lista cu argumente.
Ca exemplu, iata o functie care calculeaza aria unui dreptunghi:
<?php
function arie($lungime, $latime) {
return $lungime * $latime;
}
?>
Lista cu argumente a functiei "arie()" include argumentele $latime si
$inaltime. Corpul functiei este alcatuit dintr-o singura instructiune; cu
toate acestea, corpul unei functii poate contine mai multe instructiuni.
Daca doriti ca o functie sa returneze o valoare, trebuie sa determinati
functia sa execute o instructiune return care furnizeaza valoarea
respectiva.
Instructiunea return determina sistarea executarii functiei; nu este
necesar ca aceasta sa fie ultima instructiune fizica din corpul functiei.
Daca definiti o functie care nu are nici o instructiune return (sau pentru
date de iesire, precum "echo"), functia va returna valoarea speciala NULL.
4. Apelarea unei functii defi nite de utilizator
O functie definita de utilizator poate fi apelata ca orice functie.
De exemplu, iata o instructiune care apeleaza functia "arie()" din
exemplul anterior:
<?php
function arie($lungime, $latime) {
return $lungime * $latime;
}
$rezultat = arie(5,3);
echo "Aria exte : $rezultat";
?>
Valorile argumentelor 5 si 3 le nlocuiesc pe acelea ale argumentelor din
corpul functiei, care se comporta ca si cum ar fi fost scrisa astfel:
return 5*3
Rezultatul afisat al acestui script va fi :
Aria exte : 15
5. Terminarea executiei unui script
O instructiune return determina sistarea executiei functiei care o
contine. In cazul n care doriti sa sistati prelucrarea unui ntreg script,
puteti invoca functia exit().
Iata un exemplu simplu:
<?php
function stop() {
exit();
}
echo "<br />Unu...";
echo "<br />Doi...";
stop();
echo "<br />Trei...";
?>
Dupa executie, scriptul afiseaza:
Unu...
Doi...
Rezultatul acestui script include cuvintele "Unu" si "Doi", dar nu si
cuvntul "Trei". Prin apelarea functiei "stop()" se executa corpul functiei
respective; la invocarea functiei, exit(), executia scriptului se ncheie.
6. Functii recursive
Este posibil ca o functie din PHP sa se auto-apeleze. O functie care
procedeaza astfel se numeste "functie recursiva". Totusi, daca nu aveti
experienta de programare, este recomandat sa nu scrieti functii
recursive. Cu toate acestea, puteti scrie accidental sau intalni o
asemenea functie, deci este util sa stiti unele notiuni referitoare la
aceasta.
Studiati scriptul urmator care defineste si invoca o functie recursiva
simpla:
<?php
function recursor($nr) {
$nr++;
if ($nr<8) {
return recursor($nr);
}
return $nr;
}
$x = recursor(3);
echo $x;
?>
- Daca rulati acest script, rezultatul afisat va fi 8.
- Variabila "$x" primeste ca valoare functia "recursor()" careia ii transmite
ca argument numarul 3.
- Functia "recursor()" incrementeaza cu o unitate valoarea argumentului,
prin "$nr++;" care devine 4, apoi conditia "if ($nr<8)" verifica daca
aceasta variabila din functie e mai mica decat 8, in caz afirmativ se
executa comanda "return recursor($nr);" care sisteaza executia altui cod
din functie si auto-apeleaza iar functia (cu noua valoare a lui "$nr" ca
argument) care iar incrementeaza valoarea lui "$nr" si verifica din nou
conditia care iar autoapeleaza functia, ... si tot asa pana cand "$nr" va
avea valoarea 8 si la verificare conditiei "if" aceasta returneaza FALSE si
se trece mai departe la executia comenzii "return $nr;" care va returna 8
ca valoare a variabilei "$x".
Functia "echo" va afisa valoarea lui "$x", adica 8.
7. Defi nirea argumentelor prestabilite
PHP va permite sa definiti functii cu argumente prestabilite. Daca
apelati o functie care are un argument prestabilit, dar nu furnizati nici o
valoare pentru argumentul respectiv, argumentul ia o valoare
prestabilita specificata la inceput.
Iata un exemplu simplu, studiati-l cu atentie:
<?php
function impozit_vanzari($cantitate, $rata = 0.0725) {
return $cantitate * $rata;
}
$cumparaturi = 123.45;
echo "<br />cumparaturi = $cumparaturi";
$impozit1 = impozit_vanzari($cumparaturi, 0.09);
echo "<br />impozit1 = $impozit1";
$cumparaturi = 123.45;
echo "<br /><br />cumparaturi = $cumparaturi";
$impozit2 = impozit_vanzari($cumparaturi);
echo "<br />impozit2 = $impozit2";
?>
Rezultatu afisat va fi:
cumparaturi = 123.45
impozit1 = 11.1105
cumparaturi = 123.45
impozit2 = 8.950125
- Functia impozit_vanzari preia doua argumente: un argument obligatoriu,
denumit $cantitate, si un argument prestabilit, denumit $rata.
Daca apelati functia si furnizati un singur argument, valoarea
argumentului respectiv se considera ca fiind valoarea argumentului
$cantitate, iar valoarea 0.0725 se foloseste ca valoare a argumentului
$rata. Astfel, la prima invocare a functiei, pentru "impozit1", $rata are
valoarea 0.09, specificata drept al doilea argument al functiei. Cu toate
acestea, la a doua invocare a functiei, pentru "impozit2", $rata are
valoarea 0.0725 deoarece este specificata valoarea unui singur argument,
si astfel "$rata" a preluat valoarea prestabilita initial.
- O lista cu mai multe functii php matematice este la pagina -> Functii
PHP matematice
- De asemenea, o lista cu functii utile in lucrul mai avansat cu functii
gasiti la pagina -> Functii pentru lucru cu functii
Variabile si referinte in functii
nvatati sa folositi variabile globale, locale si statice
nvatati sa folositi referintele
Variabilele functiilor in PHP sunt de doua tipuri principale:
Variabile globale
Variabile locale
Variabilele globale sunt create n exteriorul functiei, n timp ce variabilele
locale sunt create n interiorul unei functii.
1. Utilizarea variabilelor globale
Asa cum s-a explicat anterior, variabilele globale sunt cele declarate n
afara oricarei functii.
Totalitatea locurilor unde este accesibila o variabila se numeste
"domeniu de existenta al variabilei". Variabilele globale nu pot fi
accesibile din interiorul corpului unei functii; cu alte cuvinte, domeniul de
existenta al unei variabile globale, nu include corpurile functiilor. Daca
doriti sa obtineti accesul la o variabila globala n cadrul unei functii,
puteti extinde domeniul de existenta al variabilei prin specificarea in
functie a numelui variabilei, n cadrul unei instructiuni GLOBAL.
Instructiunea GLOBAL are urmatoarea forma:
GLOBAL variabila1, variabila2, variabila3;
Iata un exemplu concludent :
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
return $var1 + $var2;
}
echo "Suma este ". Suma();
?>
- Functia "Suma()" foloseste variabilele $var1 si $var2 declarate anterior,
dar aceste variabile nu au domeniu de valabilitate in interiorul functiei.
Prin urmare rezultatul functiei este NULL.
Pentru a rezolva aceasta problema vom declara cele doua variabile ca
fiind variabile globale, ca in exempul urmator:
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
GLOBAL $var1, $var2;
return $var1 + $var2;
}
echo "Suma este ". Suma();
?>
- In exemplul de mai sus declaratia: "GLOBAL $var1, $var2" face ca
variabilele $var1 si $var2 sa fie recunoscute si in interiorul functiei.
- Puteti scrie si cu litere mici "global", dar e mai usor de recunoscut cu
litere mari.
O alta metoda prin care putem solutiona aceasta problema este prin
folosirea variabilei PHP predefinite $GLOBALS, dupa cum puteti vedea in
exemplu urmator:
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
return $GLOBALS['var1'] + $GLOBALS['var2'];
}
echo "Suma este ". Suma();
?>
$GLOBALS este o variabila predefinita, este de fapt un array ; elementele
acestei matrice au cheia egala cu numele variabilelor declarate si
valoarea egala cu cea a variabilelor declarate.
$GLOBALS este o variabila superglobala, ea va fi recunoscuta in orice
script.
Puteti folosi oricare din cele doua variante prezentate:
instrucrtiunea GLOBAL sau variabila $GLOBALS.
In cele doua exemple prezentate mai sus rezultatul afisat va fi acelasi :
Suma este 385
2. Utilizarea variabilelor locale
Variabilele locale sunt create in interiorul functiei si sunt distruse cand
se ncheie apelul la functia respectiva. n consecinta, variabilele locale
sunt disponibile numai pe durata executiei functiei asociate.
Argumentele functiilor constituie un tip important de variabila locala. Cu
toate acestea, puteti crea o variabila locala prin simpla atribuire a unei
valori unei variabile din interiorul unei functii.
Pentru a ilustra deosebirea dintre variabilele locale si cele globale, iata
un script care defineste o variabila locala denumita "$x" si o variabila
globala cu acelasi nume:
<?php
function v_local() {
$x = 5;
echo "<br />In corpul functiei x = $x";
}
$x = 2;
echo "<br />In corpul scriptului x = $x";
v_local();
echo "<br />In corpul scriptului x = $x";
?>
Cand executati acest script, veti primi urmatoarele rezultate:
In corpul scriptului x = 2
In corpul functiei x = 5
In corpul scriptului x = 2
Remarcati diferenta dintre cele doua variabile $x, chiar daca numele
variabilelor este acelasi.
Cand este apelata functia v_local(), $x ia valoarea 5, in rest, inainte si
dupa, ia valoarea 2.
Domeniul de existenta al variabilei globale $x nu se extinde n interiorul
corpului functiei v_local(), iar domeniul de existenta al variabilei locale $x
nu se extinde dincolo de corpul functiei respective. Cu alte cuvinte,
domeniile de existenta ale celor doua variabile sunt complet distincte.
3. Utilizarea variabilelor statice
Uneori este nevoie ca o variabila locala sa-si pastreze valoarea de la un
apel al functie asociate la altul. Altfel spus, nu doriti ca variabila sa fie
distrusa la ncheierea apelului la functie.
Pentru acest lucru puteti folosi instructiunea STATIC (la fel cu "static").
Forma instructiunii STATIC este similara cu aceea a
instructiunii GLOBAL.
STATIC $var1, $var2, $var3;
O variabila afisata ntr-o instructiune STATIC este cunoscuta sub numele
de "variabila statica".
Iata un exemplu care prezinta modul de utilizare a unei variabile statice:
<?php
function v_local() {
$x = $x + 1;
echo "<br /> x = $x";
}
function v_static() {
STATIC $x;
$x = $x + 1;
echo "<br /> x = $x";
}
v_local();
v_local();
v_local();
v_static();
v_static();
v_static();
?>
Daca rulati acest script, veti primi urmatoarele rezultate:
x
x
x
x
x
x
=
=
=
=
=
=
1
1
1
1
2
3
Observati ca variabila locala $x, definita n cadrul functiei v_local(), este
creata din nou la fiecare apelare a functiei, n consecinta, valoarea sa este
ntotdeauna afisata ca fiind egala cu 1.
Prin contrast, variabila statica $x, definita n cadrul functiei v_static(), si
pastreaza valoarea de la un apel al functiei la urmatorul; ca atare,
valoarea sa creste de fiecare data cnd este executata functia.
4. Utilizarea referintelor
In mod prestabilit, argumentele transferate unei functii PHP sunt
transmise prin valoare, ceea ce nseamna ca valorile argumentelor sunt
copiate si functiile utilizeaza copii ale valorilor argumentelor lor, nu
argumentele n sine. Ca o consecinta, o functie PHP nu poate modifica
valorile argumentelor sale.
Totusi, puteti stabili ca o functie sa aiba posibilitatea de a modifica
valoarea unui argument, specificnd ca argumentul sa fie transferat prin
referinta.
Cnd un argument este transferat prin referinta, valoarea sa nu este
copiata; functia lucreaza cu valoarea argumentului si are libertatea de a
modifica acea valoare.
Pentru a specifica faptul ca un argument urmeaza a fi transferat prin
referinta, inaintea argumentului va fi adaugat un caracter ampersand
(&). Puteti atasa acest caracter la argument n antetul functiei sau n
apelul la functie.
Iata un exemplu care prezinta apelul prin valoare si apelul prin referinta:
<?php
function p_valoare($a) {
$a = 1;
}
function p_referinta(&$a) {
$a = 1;
}
$b = 0;
p_valoare($b);
echo "<br /> \$b = $b";
$b = 0;
p_valoare(&$b);
echo "<br /> \$b = $b";
$b = 0;
p_referinta($b);
echo "<br /> \$b = $b";
?>
Dupa rulati acest script, veti obtine urmatoarele date de iesire:
$b = 0
$b = 1
$b = 1
Retineti ca scriptul contine doua functii, si anume "p_valoare()" si
"p_referinta()". Fiecare functie preia un singur argument, denumit $a.
Antetul functiei "p_referinta()" specifica faptul ca argumentul sau este
transferat prin referinta; argumentul functiei "p_valoare()" este transferat
prin valoare.
Primul paragraf al programului invoca functia "p_valoare()", transfernd
argumentul prin valoare. n consecinta, functia lucreaza cu o copie a
argumentului sau, iar valoarea variabilei $b nu se modifica.
Cel de-al doilea paragraf al programului invoca de asemenea functia
"p_valoare()"; dar, foloseste un caracter ampersand (&) pentru a
determina transferul prin referinta al valorii variabilei $b. n consecinta,
functia modifica valoarea argumentului sau, care se transforma din 0 n 1.
Cel de-a treilea paragraf al programului invoca functia "p_referinta()".
Antetul functiei respective foloseste un caracter ampersand (&) pentru a
specifica faptul ca valoarea argumentului sau este transferata prin
referinta, n consecinta, functia modifica valoarea argumentului sau, care
se transforma din 0 n l.
Prin utilizarea referintelor se evita suprasarcina de copiere a valorilor argumentelor si
implicit se obtine o viteza mai mare de executie a programului. Cu toate acestea,
programele devin astfel mai dificil de nteles, iar referintele sau apelurile prin referinta pot
cauza erori de program. Cel mai indicat este sa evitati referintele, acolo unde este posibil,
si sa definiti functii care returneaza valori, si nu functii care modifica valorile propriilor
argumente.
In versiunile PHP 5+, transmiterea la functiei a unui parametru prin referinta "Call-time
pass-by-reference", p_valoare(&$b), a fost scoasa din uz. Dar poate fi activata din
[Link], daca aveti acces, prin setarea 'true' la "allow_call_time_pass_reference".
Data si Timpul in PHP
PHP are mai multe functii pentru lucru cu Data zilei si Timpul /Ora.
Cele mai utilizate sunt acestea:
date() - transforma Timestamp (denumit si timpul Unix, numarul de secunde
de la 1 Ianuarie 1970) intr-un format de data citet /textual.
time() - Returneaza timpul Unix /Timestamp curent (numarul de secunde de
la 1 Ianuarie 1970 pana in prezent).
microtime() Returneaza timpul Unix /timestamp curent in microsecunde.
getdate() - Returneaza un array asociativ ce contine informatii despre data
si timp.
- Aceste functii permit sa preiei data si timpul de la server in script-ul PHP;
ele depind de setarile locale ale serverului.
PHP date()
Functia PHP date() e utilizata pt. formatarea Timestamp in data /timp.
- Sintaxa:
date("format", timestamp)
- format - Un sir format din caractere ce reprezinta data returnata. Ex.:
"D, d M Y H:i:s" rezulta => "Mon, 15 Aug 2012 [Link] +0000"
- timestamp - numarul de secunde de la 1-01-1970 pana la o anumita
data. Este optional, daca nu e specificat se foloseste Timestamp-ul curent.
Aceasta functie returneaza un sir cu formatul datei, sau False in caz de
eroare.
O lista cu mai multe functii si exemple de lucru cu data si timpul la
pagina: Functii pentru Data si Timp.
- Exemplu, preia data curenta, Zi-Luna-An:
$today = date('d-m-Y');
echo $today;
In mod standard, functia date() foloseste timpul zonal al serverului. Ca sa
setati un alt timp zonal, utilizati
functiadate_default_timezone_set('timezone_identifier'), adaugata
inainte de alte functii pt data si timp.
Parametrul "timezone_identifier" e un sir cu identificatorul zonei de timp
(ex.: 'America/New_York' sau 'Europe/Bucharest'). Lista completa de
timpuri zonale pt PHP e la pagina: Lista zone de timp pt PHP.
- Exemplu:
<?php
date_default_timezone_set('Europe/Bucharest');
Romania (Bucuresti)
// seteaza timpul zonal pt
// returneaza ziua curenta din saptamana
echo date('l');
// returneaza data zilei curente (zi-luna-an)
echo '<br />'. date('j-F-Y');
// returneaza Ora:minute:secunde a timpului curent
echo '<br />'. date('H:i:s');
?>
Rezultat:
Sunday
28-October-2012
[Link]
In acest exemplu nu e specificat un timestamp, astfel, functia date()
lucreaza cu timpul actual, zona Romania /Bucuresti.
Ca sa obtineti timpul Unix /Timestamp-ul curent (numarul de secunde), se utilizeaza
functia time() (ex.: $ts = time(); ).
Alte exemple cu functii pentru Data si Timp
Ca sa lucrati cu Timestamp-ul unei anumite date specifice, utilizati
functia mktime().
- Sintaxa:
mktime(ore, minute, secunde, luna, zi, an)
Returneaza timpul Unix corespunzator argumentului.
Se poate utiliza si functia strtotime(). Returneaza timpul Unix a sirului
din parametru cu data textuala in limba engleza.
- Sintaxa:
strtotime("timpul")
- Parametrul "timpul" e un sir /text cu data in limba engleza (ex.: "now",
"+1 Day", "15 October 2012", "next Sunday", etc.).
O lista cu formate valabile e la pagina Formate Data si Timp.
Exemplu cu mktime() ai strtotime():
<?php
// preia Timestamp-ul datei October 15, 1976, [Link] (cu mktime)
// returneaza Timestamp-ul si ziua din saptamana a acestei date
$stamp = mktime(20, 38, 0, 10, 15, 1976);
echo 'Timestamp: '. $stamp;
echo '<br /> October 15, 1976 este '. date('l', $stamp);
// Exemplu cu strtotime()
echo '<br /><br />Exemplu cu strtotime():<br />';
echo '<br /> 15 October 1976, [Link] - '. strtotime('15 October 1976, [Link]');
// Alte exemple
echo '<br /> 07 July 1996 - '. strtotime('07 July 1996');
echo '<br /> +3 days - '. strtotime('+3 days');
echo '<br /> +1 one week - '. strtotime('+1 week');
echo '<br /> +1 week 2 days 3 hours 30 seconds - '. strtotime('+1 week 2 days 3
hours 30 seconds');
echo '<br /> next Sunday - '. strtotime('next Sunday');
?>
Acest cod va afisa:
Timestamp: 214252680
October 15, 1976 este Friday
Exemplu cu strtotime():
15 October 1976, [Link] - 214252680
07 July 1996 - 836686800
+3 days - 1300950386
+1 one week - 1301292386
+1 week 2 days 3 hours 30 seconds - 1301476016
next Sunday - 1301176800
Ziua 0 dintr-o luna reprezinta ultima zi din luna precedenta.
De exemplu, ziua 0 din Martie 2012 este "29", ultima zi din Februarie 2012:
echo date('d', mktime(0, 0, 0, 03, 0, 2012));
// 29
O alta functie utila pt data si timp e getdate()
- Sintaxa:
getdate(timestamp)
- timestamp - E optional, un numar intreg cu timpul Unix. Daca nu e
specificat, foloseste timestamp-ul curent.
getdate() returneaza un array asociativ cu informatii despre data si timpul
din "timestamp", sau cel curent daca nu e specificat.
- Exemplu:
<?php
$now = getdate();
echo '<pre>';
var_export($now);
echo '</pre>';
?>
Acest cod va afisa un array similar cu acesta:
array (
'seconds' => 48,
'minutes' => 30,
'hours' => 9,
'mday' => 21,
'wday' => 1,
'mon' => 3,
'year' => 2011,
'yday' => 79,
'weekday' => 'Monday',
'month' => 'March',
0 => 1300692648,
)
- Exemplu cu microtime() (returneaza timpul Unix /timestamp curent in
microsecunde). E util, de exemplu in a afla timpul de executie a unui cod
PHP.
- Cod:
<?php
$load_time = -microtime(true);
// instructiuni php
$load_time += microtime(true);
echo $load_time. ' seconds';
?>
Lucrul cu siruri (1)
nvatati sa utilizati secvente escape suplimentare pentru a include n siruri
caracterele speciale
nvatati sa utilizati codurile ASCII
nvatati sa creati date de iesire formatate
n Lectia 2 au fost prezentate sirurile, tipul de date PHP care stocheaza
texte, n aceasta lectie veti nvata mai multe despre utilizarea sirurilor.
1. Crearea si afi sarea sirurilor
Sa recapitulam notiunile elementare ale sirurilor
Valorile de tip sir sunt secvente de caractere incluse ntre ghilimele duble sau
simple
Puteti include un caracter special n cadrul unui sir folosind o secventa
escape care reprezinta caracterul special.
Variabilele pot fi de tip string si li-se poate atribui o valoare de tip sir.
Operatorul de concatenare, punct, ( . ) se poate folosi pentru unirea sirurilor.
PHP poate converti n mod automat o valoare numerica ntr-un sir, respectiv
valoarea unui sir ntr-un numar.
Secventele escape folosite n PHP:
\n - salt la linie noua
\r - retur de car (rand nou)
\t - caracter de tabulare pe orizontala
\\ - backslash
\$ - simbolul dolarului
\" - ghilimele duble
\xxx - caracterul asociat valorii ASCII xxx, exprimata sub forma unui numar
in octal
\xnn - caracterul asociat valorii ASCII xxx, exprimata sub forma unui numar
n hexazecimal
2. Secvente escape si cod ASCII
Ultimele doua secvente escape prezentate mai sus folosec un cod ASCII
(America Standard Code for Information Interchange) pentru
reprezentarea unui caracter.
Codurile ASCII sunt valori ntregi, care sunt cuprinse ntre 0 si 255;
fiecare litera sau simbol folosit frecvent n limbile vest-europene are
asociat un cod ASCII. De exemplu, codul ASCII asociat literei A este 65,
iar codul asociat cifrei l este 49.
Prima secventa escape necunoscuta (\xxx) va permite sa folositi
reprezentarea n octal (baza 8) a unui cod ASCII pentru specificarea
caracterului corespunzator. De exemplu, valoarea zecimala 65 (care este
codul ASCII al literei A) poate fi reprezentata n octal sub forma 101. Ca
atare, puteti reprezenta litera A folosind secventa escape "\101".
Cea de-a doua secventa escape necunoscuta (\xnn) va permite sa
folositi reprezentarea hexazecimala (n baza 16) a unui cod ASCII pentru
specificarea caracterului corespunzator. De exemplu, valoarea zecimala
65 (care este codul ASCII al literei A) poate fi reprezentat sub forma
hexazecimala 41. Ca atare, puteti reprezenta litera A cu ajutorul
secventei escape "\41".
Valoarea unui numar zecimal este suma produselor dintre fiecare cifra
care l compune si o putere a lui 10. De exemplu, numarul zecimal 123
are valoarea l x 10 la puterea 2 + 2 x 10 la puterea 1 + 3 x 10 la puterea
0 = 1x100 + 2x10 + 3x1.
Puteti determina valoarea unui numar reprezentat folosind o alta baza
prin nlocuirea lui 10 cu valoarea bazei respective ntr-o expresie ca
aceea prezentata anterior. De exemplu, valoarea hexazecimala 123 este
echivalenta cu valoarea zecimala l x 16 la puterea 2 + 2 x 16 la puterea
1 + 3 x 16 la puterea 0 = l x 156 + 2 x 16 + 3 x l = 291.
Similar, valoarea n octal 123 este echivalenta cu valoarea zecimala 1x8
la puterea 2 + 2x8 la puterea 1 + 3x8 la puterea 0 = 1x64 + 2x8 +
3xl=83.
Daca vi se pare complicat sa calculam astfel, nu intrati n panica; n
continuare veti nvata sa determinati valoarea n octal sau hexazecimal
echivalenta cu orice valoare zecimala, folosind functii PHP.
3. Utilizarea codurilor ASCII
Numeroase functii PHP sunt deosebit de folositoare la utilizarea
codurilor ASCII. Aceste functii sunt enumerate n tabelul urmator.
Functii folositoare n utilizarea codurilor ASCII
Functie
Descriere
chr(/n)
- Returneaza caracterul avnd codul ASCII dat de
"n"
dechex( - Returneaza valoarea hexazecimala echivalenta
n)
cu valoarea zecimala data de "n"
decoct(n - Returneaza valoarea n octal echivalenta cu
)
valoarea zecimala data de "n"
hexdec( - Returneaza valoarea zecimala echivalenta cu
n)
valoarea hexazecimala data de "n"
octdec(n - Returneaza valoarea zecimala echivalenta cu
)
valoarea n octal data de "n"
ord(c)
- Returneaza codul ASCII echivalent caracterului
"c"
Iata un exemplu de utilizare a functiei ord() pentru a determina codul
ASCII corespunzator unui anumit caracter:
<?php
$c = "A";
$n = ord($c);
echo "<br /> Valoarea ASCII a caracterului $c este $n";
?>
Scriptul va afisa urmatorul rezultat:
Valoarea ASCII a caracterului A este 65
Iata un exemplu care afiseaza echivalentele n octal, respectiv
hexazecimal al caracterelor ASCII ale caror coduri sunt cuprinse ntre 33 si
40:
<?php
for ($i=33; $i<40; $i++) {
$c=chr($i);
$octal = decoct($i);
$hex = dechex($i);
echo "<br /> $i (octal $octal, hex $hex): caracter - $c";
}
?>
Scriptul va afisa urmatorul rezultat:
33
34
35
36
37
38
39
(octal
(octal
(octal
(octal
(octal
(octal
(octal
41,
42,
43,
44,
45,
46,
47,
hex
hex
hex
hex
hex
hex
hex
21):
22):
23):
24):
25):
26):
27):
caracter
caracter
caracter
caracter
caracter
caracter
caracter
!
"
#
$
%
&
'
4. Crearea datelor de iesire formatate
PHP include doua functii utile pentru generarea datelor de iesire
formatate, n speta printf() si sprintf().
Functia printf() afiseaza datele sale de iesire, n timp ce
functia sprintf() returneaza datele sale de iesire sub forma unei valori
sir.
n general, fiecare functie preia doua sau mai multe argumente. Primul
argument este un sir, denumit sir de formatate, care specifica formatul
datelor de iesire, iar celelalte argumente specifica valorile care vor
constitui datele de iesire.
Iata un exemplu simplu de utilizare a functiei sprintf():
<?php
$num = 8.7;
echo $num;
$num = sprintf("%05.2f", $num);
echo '<br>'. $num;
?>
- Rezultatul afisat va fi:
8.7
08.70
- Cu ajutorul expresiei "%05.2f", sprintf() formateaza numarul din $num
astfel incat acesta sa fie format din 5 caractere dintre care unul punct (.)
si 2 zecimale.
Iata si doua exemple de utilizare a functiei printf():
<?php
$n = 8;
printf("Valoarea lui n este: %d", $n);
?>
- Va afisa "Valoarea lui n este: 8".
Al doilea exemplu, putin mai complicat, prezinta modul de utilizare a
functiei printf() cu mai multe argumente pentru datele de iesire:
<?php
$sir = 'Aceasta este lectia %d din cursul %s';
$num = 13;
$tip = 'PHP';
printf($sir, $num, $tip);
?>
- Includerea datelor formatate in sir se face in ordinea adaugarii
variabilelor intre parantezele functiei "sprintf()".
- Va afisa "Aceasta este lectia 13 din cursul PHP".
Sirul de formatare consta dintr-o serie de caractere si directive ordinare.
Un caracter ordinar este orice caracter, n afara caracterului "%".
Caracterele ordinare sunt pur si simplu copiate la iesire.
Directivele reprezinta secvente de caractere care ncep cu simbolul "%";
aceste determina modul n care va fi formatat argumentul corespunzator.
O directiva simpla, cum este cea din exemplul precedent, poate consta
dintr-un caracter "%" urmat de un specificator de tip, precum "d", care
arata ca argumentul trebuie tratat ca numar zecimal. Cu toate acestea, o
directiva mai sofisticata poate include urmatoarele componente, care
trebuie sa apara n ordinea indicata:
Specificator de completare (optional): - Un specificator de completare
precizeaza caracterul care se va folosi pentru a completa rezultatul pna la
dimensiunea ceruta a sirului, n cazul n care caracterul de completare este
omis, rezultatul este completat cu spatii. Specificatorul de completare
poate fi un caracter spatiu sau un 0 (zero). Un specificator de completare
de tip spatiu este folosit frecvent cu sirurile, iar un specificator de
completare zero se foloseste mai ales alaturi de numere. Un alt caracter de
completare poate fi specificat prin prefixarea acestuia cu un singur semn al
citarii ('). De exemplu, pentru a completa un rezultat cu liniute de
subliniere, specificati '_ drept caracter de completare.
Specificator de aliniere (optional): - Un specificator de aliniere indica daca
rezultatul trebuie sa fie aliniat la stnga sau la dreapta. Daca specificatorul
de aliniere este omis, rezultatul va fi aliniat la dreapta; daca se indica o
cratima (-) drept specificator de aliniere, rezultatul va fi aliniat la stnga.
Specificator de latime (optional): - Un specificator de latime este un ntreg
care determina numarul minim de caractere ale rezultatului; sau, daca
argumentul este de tip double, numarul minim de caractere situate la
stnga punctului zecimal. Daca rezultatul contine un numar mai redus de
caractere, atunci va contine si caractere de completare.
Specificator de precizie (optional): - Un specificator de precizie este un
punct zecimal, urmat de un ntreg care determina numarul de cifre dupa
punctul zecimal pe care trebuie sa le contina rezultatul. Specificatorul de
precizie nu are nici un efect pentru alte tipuri dect double (float).
Specificator de tip (obligatoriu): - Specificatorul de tip determina modul de
tratare si afisare a argumentului.
Tabelul urmator prezinta specificatorii de tip disponibili.
Specificatorii de tip PHP folositi la formatarea
sirurilor
Specificat
or de tip
Descriere
- Trateaza argumentul ca pe un ntreg si l
afiseaza ca valoare binara
- Trateaza argumentul ca pe un ntreg si
afiseaza caracterul cu aceeasi valoare ASCII
ca si argumentul
- Trateaza argumentul ca pe un ntreg si l
afiseaza ca valoare zecimala
- Trateaza argumentul ca pe o valoare de tip
double si l afiseaza ca valoare cu virgula
mobila
- Trateaza argumentul ca pe un ntreg si l
afiseaza ca pe o valoare scrisa n octal
s
- Trateaza argumentul ca pe un sir si l
afiseaza
- Trateaza argumentul ca pe un ntreg si l
afiseaza ca numar hexazecimal, cu litere
scrise cu minuscule
- Trateaza argumentul ca pe un ntreg si l
afiseaza ca numar hexazecimal, cu litere
scrise cu majuscule
Daca doriti sa inserati simbolul procentului n datele de iesire ale unui
apel la functia printf() sau sprintf(), inserati doua caractere "%".
Tabelul urmator prezinta rezultatele aplicarii a diferite siruri de formatare
valorilor selectate. Studiati tabelul si verificati daca ati nteles corect
modul de operare a specificatorilor din cadrul fiecarui sir de formatare.
Remarcati ca, n cazul omiterii cifrelor zecimale, se produce automat o
rotunjire.
Spatiile au fost nlocuite prin accente circumflexe(^), pentru a facilita
determinarea numarului de spatii si a amplasarii acestora.
Exemple de rezultate ale utilizarii a diferite
siruri de formatare
Valoare
Format
Rezultat
100
%d
100
100
%b
1100100
100
%o
144
100
%x
64
100
%f
100.000000
12.345
%^-10f
12.345000^^^^^^^^
12.345
%^10f
^^^^^^^^12 .345000
12.345
%^-10.2f
12.35^^^^^^^^
12.345
%10.2f
^^^^^^^^12.35
test
%^-10s
test^^^^^^
test
%^10s
*^^^^^^test
Daca utilizarea functiilor printf() si sprintf() pentru formatarea
numerelor pare cam greoaie, puteti folosi functia number_format(), care
returneaza o valoare de tip sir continnd un rezultat formatat. Puteti apela
functia cu unul, doua sau patru argumente:
number_format(numar)
number_format(numar, zecimale)
number_format(numar, zecimale, punct_zecimal, separator_mii)
- Argumentul "numar" specifica valoarea numerica pe care doriti sa o
formatati.
- Argumentul "zecimale" specifica numarul dorit de cifre zecimale.
- Argumentul "punct_zecimal" precizeaza caracterul ce se va folosi drept
punct zecimal.
- Argumentul "separator_mii' precizeaza caracterul care se va folosi ca
separator al miilor.
n mod prestabilit, rezultatul este formatat fara zecimale, este inserat un
punct (.) naintea cifrelor care compun partea zecimala, respectiv se
foloseste o virgula (,) pentru separarea miilor.
De exemplu, apelul la functia number_format(1.234, 2) returneaza
valoarea 1.23
Functia PHP sscanf(), este complementara functiei printf(). Daca
functia printf() genereaza date de iesire formatate,
functia sscanf() citeste un sir, l interpreteaza prin referirea la un sir de
formatare si stabileste valorile variabilelor specificate n functie de
continutul sirului.
Sa luam n considerare urmatorul exemplu:
<?php
$subiect = "08,25,2008";
$n = sscanf($subiect, "%d,%d,%d", &$luna, &$zi, &$an);
echo "Au fost gasite $n valori";
echo "<br /> luna = $luna";
echo "<br /> zi = $zi";
echo "<br /> an = $an";
?>
Datele de iesire ale acestui script sunt:
Au fost gasite 3 valori
luna = 8
zi = 25
an = 2008
- O lista cu mai multe functii utile in lucrul cu siruri gasiti la pagina
-> Functii pentru siruri
Lucrul cu siruri (2)
nvatati sa maniupulati sirurile folosind diferite functii
Invatati sa lucrati cu subsiruri
1. Manipularea sirurilor
PHP contine peste 70 de functii care lucreaza cu siruri. Aceasta
sectiune descrie cateva functii pe care este posibil sa le utilizati frecvent.
Aceste functii va permit sa obtineti lungimea unui sir, sa eliminati dintrun sir caracterele de tip spatiu alb, sa convertiti caracterele unui sir n
majuscule sau minuscule si altele.
- Functia strlen() returneaza lungimea sirului specificat ca argument al
functiei.
Iata un exemplu simplu de utilizare a functiei strlen():
<?php
$s = "Acesta este un sir";
$n = strlen($s);
echo "<br /> Lungimea sirului este: $n";
?>
Scriptul de mai sus va afisa:
Lungimea sirului este: 18
- Numeroase functii PHP va permit sa eliminati caracterele de tip spatiu
alb de la una sau ambele extremitati ale unui sir.
Iata un exemplu; care prezinta modul de operare al acestor functii:
<?php
$s = "
Acesta este un sir
";
$n = strlen($s);
echo "<br /> Lungimea sirului este: $n";
$trim =chop($s);
// Elimina spatiile albe din partea dreapta a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
$trim = ltrim($s);
// Elimina spatiile albe din partea stanga a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
$trim = rtrim($s);
// Elimina spatiile albe din partea dreapta a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
$trim = trim($s);
// Elimina spatiile albe din ambele parti a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
?>
Scriptul de mai sus va afisa:
Lungimea
Lungimea
Lungimea
Lungimea
Lungimea
sirului
sirului
sirului
sirului
sirului
este:
este:
este:
este:
este:
36
27
27
27
18
Urmatorul tabel prezinta Functiile PHP de eliminare a caracterelor din
siruri:
Functii PHP de eliminare a caracterelor din siruri
Funct
ie
Descriere
chop( - Returneaza valoarea lui 's', eliminnd spatiile albe
s)
de la extremitatea din dreapta a sirului. Similar
cu rtrim()
ltrim( - Returneaza valoarea lui 's', eliminnd spatiile albe
s) de la extremitatea din stnga a sirului
- Returneaza valoarea lui 's', eliminnd spatiile albe
rtrim
de la extremitatea din dreapta a sirului. Similar
(s)
cu chop()
trim( - Returneaza valoarea lui 's', eliminnd spatiile albe
s) de la ambele extremitati
- Functia strtoupper() returneaza valoarea argumentului, convertita la
majuscule.
- Functia strtolower{) returneaza valoarea argumentului, convertita la
minuscule.
- Functia ucfirst{) returneaza valoarea argumentului, cu primul caracter
din sir majuscula.
Nici una din functii nu modifica valoarea argumentului, valoarea
convertita este cea returnata ca rezultat al functiei.
Iata un scurt exemplu, care prezinta modul de operare a acestor functii:
<?php
$s = "abcdefg";
$rezultat = strtoupper($s);
$rezultat2 = ucfirst($s);
echo "<br />strtoupper('$s'): $rezultat";
echo "<br />ucfirst('$s'): $rezultat2";
$s = "ABCDE";
$rezultat = strtolower($s);
echo "<br />strtolower('$s'): $rezultat";
?>
Scriptul de mai sus va afisa:
strtoupper(abcdefg): ABCDEFG
ucfirst(abcdefg): Abcdefg
strtolower(ABCDE): abcde
2. Compararea sirurilor
PHP furnizeaza patru functii care sunt deosebit de utile pentru
compararea sirurilor. Aceste functii sunt enumerate n tabelul urmator.
Fiecare functie returneaza o valoare al carei semn determina rezultatul
comparatiei; nu trebuie sa ncercati sa interpretati valoarea returnata
efectiva.
Functii PHP de comparatie ntre siruri
Functia
Descriere
- Executa o comparatie fara sensibilitate la diferenta
ntre majuscule si minuscule. Returneaza o valoare
strcasecmp(s1,
mai mica dect zero daca 's1' este mai mic dect 's2',
s2)
o valoare mai mare dect zero daca 's1' este mai
mare dect 's2', respectiv 0 n celelalte cazuri.
- Executa o comparatie cu sensibilitate la diferenta
ntre majuscule si minuscule. Returneaza o valoare
strcmp(s1, s2) mai mica dect zero daca 's1' este mai mic dect 's2',
o valoare mai mare dect zero daca 's1' este mai
mare dect 's2', respectiv 0 n celelalte cazuri.
- Executa o comparatie fara sensibilitate la diferenta
ntre majuscule si minuscule. La comparatie sunt luate
n considerare un numar de 'n' caractere. Returneaza
strncasecmp(s1
o valoare mai mica dect zero daca 's1' este mai mic
, s2, n)
dect 's2', o valoare mai mare dect zero daca 's1'
este mai mare dect 's2', respectiv 0 n celelalte
cazuri.
strncmp(s1,s2, - Executa o comparatie cu sensibilitate la diferenta
n)
ntre majuscule si minuscule. La comparatie sunt luate
n considerare un numar de 'n' caractere. Returneaza
o valoare mai mica dect zero daca 's1' este mai mic
dect 's2', o valoare mai mare dect zero daca 's1'
este mai mare dect 's2', respectiv 0 n celelalte
cazuri.
Iata un scurt exemplu care prezinta modul de utilizare a acestor functii:
<?php
$s1 = "abcd";
$s2 = "ABCE";
$rezultat = strcasecmp($s1, $s2);
echo "<br /> Functia strcasecmp a returnat $rezultat";
$rezultat = strcmp($s1, $s2);
echo "<br /> Functia strcmp a returnat $rezultat";
$rezultat = strncasecmp($s1, $s2, 3);
echo "<br /> Functia strncasecmp returnat $rezultat";
$rezultat = strncmp($s1, $s2, 3);
echo "<br /> Functia strncmp a returnat $rezultat";
?>
Scriptul de mai sus va afisa:
Functia
Functia
Functia
Functia
strcasecmp a returnat -1
strcmp a returnat 1
strncasecmp returnat 0
strncmp a returnat 1
Datele de iesire va arata ca functia strcasecmp() a identificat sirul
"abcd" ca fiind mai mic dect "ABCE", in schimb, functia strcmp(), la fel
ca si functiastrncmp(), a identificat sirul "abcd" ca fiind mai mare dect
"ABCE". Aceasta s-a ntmplat deoarece literele minuscule au n secventa
ASCII o pozitie superioara literelor scrise cu majuscule; litera 'A' are
valoarea ASCII 65, iar litera 'a' are valoarea ASCII 97.
De asemenea, datele de iesire arata ca functia strncasecmp() a
identificat sirul "s1" ca egal cu "s2", deoarece au fost luate in considerare
numai primele 3 caractere.
3. Descoperirea si extragerea sub-sirurilor
PHP include numeroase functii care gasesc si extrag sub-tiruri, adica
parti dintr-un sir. Cele mai importante functii de acest gen sunt rezumate
n tabelul urmator:
Functii PHP de extragere si cautare
Functie
Descriere
strchr(s1,s2)
- Returneaza toate sirurile 's1' de la prima aparitie a
sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit,
functia returneaza FALSE. Functia strstr() executa
aceeasi operatie
stristr(s1,s2)
- Returneaza toate sirurile 's1' de la prima aparitie a
sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit,
functia returneaza FALSE. Sirurile 's1' si 's2' sunt
comparate fara a se tine cont daca literele sunt
majuscule sau minuscule
- Returneaza pozitia (nr. intreg) a primei aparitii a
strpos(s1,s2) sirului 's2' n 's1'.Daca 's2' nu este gasit, functia
returneaza FALSE
- Returneaza toate sirurile 's1' de la ultima aparitie a
sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit,
strrchr(s1,s2)
functia returneaza FALSE. La comparatie este folosit
numai primul caracter al sirului 's2'
strstr(s1,s2)
- Returneaza toate sirurile 's1' de la prima aparitie a
sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit,
functia returneaza FALSE. Functia strchr() executa
aceeasi operatie
substr(s,
- Returneaza portiunea sirului 's' specificata de indexul
starf)
ntreg 'start' respectiv de indexurile 'start' si 'lung'.
substr(s, start,
Prima pozitie a sirului este pozitia 0.
lung)
Iata un exemplu simplu, care prezinta modalitatile de utilizare a mai
multor functii de extragere si cautare:
<?php
$s = "the cat on the mat near the bat";
$b = "at";
$n = strpos($s, $b);
echo "<br /> strpos(\"$s\", \"$b\"): $n";
$s = "the cat on the mat near the bat";
$b = "at";
$n = strchr($s, $b);
echo "<br /> strchr(\"$s\", \"$b\"): $n";
$s = "the cat on the mat near the bat";
$b = "at";
$n = strrchr($s, $b);
echo "<br /> strrchr(\"$s\", \"$b\"): $n";
$s = "the cat on the mat near the bat";
$rezultat = substr($s, 4, 3);
echo "<br /> substr(\"$s\", 4, 3): $rezultat";
?>
Studiati cu atentie scriptul si tabelul de mai sus pentru a intelege
datele de iesire. Iata si datele de iesire:
strpos("the cat on the mat near the bat", "at"): 5
strchr("the cat on the mat near the bat", "at"): at on the mat near the bat
strrchr("the cat on the mat near the bat", "at"): at
substr("the cat on the mat near the bat", 4, 3): cat
O potentiala dificultate n utilizarea functiei strpos() consta n aceea ca
poate fi greu de sesizat diferenta dintre valoarea returnata 0, care arata
ca sub-sirul a fost gasit n pozitia initiala a sirului, si valoarea returnata
FALSE, care arata ca sub-sirul nu a fost gasit.
Iata un scurt exemplu care indica un mod adecvat de testare a valorii
returnate de functia strpos(), astfel nct sa se poata face diferenta ntre
cele doua rezultate:
<?php
$poz = strpos($s1, $s2);
if ($poz == FALSE) {
echo "<br /> sub-sirul nu a fost gasit";
}
?>
Procedeul prezentat foloseste operatorul de identitate (==) pentru a
determina daca valoarea returnata este identica - nu doar aritmetic egala
- cu valoarea FALSE.
4. nlocuirea unui sub-sir
O operatie frecvent folosita n programare consta n gasirea unui sub-sir
si nlocuirea sa cu o valoare noua. PHP are doua functii deosebit de utile
pentru asemenea operatii, si
anume str_replace() si substr_replace().
Mai jos sunt prezentate pe scurt aceste functii.
Remarcati ca functia str_replace() noteaza sub-sirul prin valoarea sa, n
timp ce functia substr_replace() noteaza sub-sirul prin pozitia sa n
interiorul sirului subiect.
str_replace(cauta, nlocuire, subiect) - Se cauta n sirul 'subiect' sub-sirul
'cauta'; daca sub-sirul este gasit, returneaza valoarea 'subiect', nlocuinduse prima aparitie a sirului 'cauta' cu 'nlocuire'.
substr_replace(subiect, nlocuire, start, lungime) - Returneaza valoarea
'subiect', nlocuind sub-siruf care ncepe de la 'start' si avnd lungimea
'lungime' cu sirul 'nlocuire'.
Iata un exemplu care prezinta modul de utilizare a acestor functii:
<?php
$subiect = "the cat on the mat near the bat";
echo "<br /> Subiect : $subiect";
$cauta = "cat";
$inlocuire = "DOG";
$rezultat = str_replace($cauta, $inlocuire, $subiect);
echo "<br /> str_replace : $rezultat";
$inlocuire = "CAT";
$rezultat = substr_replace($subiect, $inlocuire, 4, 3);
echo "<br /> substr_replace : $rezultat";
?>
Iata si rezultatul exemplului :
Subiect : the cat on the mat near the bat
str_replace : the DOG on the mat near the bat
substr_replace : the CAT on the mat near the bat
- O lista cu mai multe functii utile in lucrul cu siruri gasiti la pagina
-> Functii pentru siruri
Expresii regulate, regex
Invatati sa scrieti si sa utilizati expresii regulate
Invatati sa verificati sirurile in functie de expresii regulate
1. Scrierea expresiilor regulate (Regex)
Expresiile regulate (regex) sunt un sir de caractere sablon care descriu
multimea cuvintelor posibile care pot fi formate cu acele caractere,
respectand anumite reguli. Aceste expresii regulate folosesc paranteze
(rotunde, patrate, acolade) prin care formeaza regulile de formare a
cuvintelor. Utilitatea cea mai frecventa a unei expresii regulate consta n
a recunoaste daca un sir contine sau nu cuvinte sau sub-sir care pot fi
formate prin expresia regulata respectiva.
De ex.: expresia m[ai]r poate forma cuvintele: mar si mir
Sa presupunem ca doriti sa specificati un sir care poate include orice
vocala. Puteti face aceasta folosind expresia regulata [aeiou]. Prin
includerea valorilor posibile ntre paranteze, formati o expresie regulata
echivalenta cu formularea "alege oricare din aceste valori". Daca doriti
sa permiteti si utilizarea, majusculelor, puteti scrie [aeiouAEIOU].
Sa presupunem ca doriti sa specificati un sir care poate include orice
caracter scris cu minuscule. Puteti
scrie: [abcdefghijklmnopqrstuvwxyz]. Sau puteti folosi o forma mai
compacta [a-z], unde prin cratima se ntelege "o serie de caractere
consecutive".
Sa presupunem ca doriti sa specificati intr-o expresie regulata sirurile
"sat", "mat" si "lat". Pentru aceasta, aveti nevoie de expresia
regulata [sml]at. Semnificatia acestei expresii regulate este
urmatoarea: "alege oricare din literele 's', 'm' si 'l' si scrie dupa litera
respectiva literele 'at'".
Daca un accent circumflex (^) este primul simbol mentionat ntre
parantezele drepte, acesta are ca efect inversarea semnificatiei
expresiei regulate plasate ntre paranteze.
De exemplu, expresia regulata [^a-z] corespunde oricarui caracter care nu
este o litera mica.
Pentru a specifica faptul ca o expresie regulata se poate repeta,
expresia regulat va fi urmata de o pereche de acolade, care includ
limitele superioara si inferioara ale repetitiei.
De exemplu, expresia regulata [aeiou]{1,4} corespunde sirurilor care pot
contine intre 1 si 4 vocale.
Pentru a specifica repetarea mai multor parti ale unei expresii regulate,
includeti partile respective ntre paranteze rotunde.
De exemplu, expresia regulata ([sml]at){1 ,2} corespunde unui numar de
una sau doua repetari ale oricaruia dintre sirurile "sat", "mat" sau "lat".
Pentru a simplifica scrierea de reguli intr-o expresie regulata se folosesc
anumite caractere "speciale"
Sa presupunem ca doriti sa reprezentati o nmultire intre doua numere,
puteti obtine ceva de genul [0-9]*[0-9]. Totusi, aceasta expresie
regulata nu are semnificatia dorita, deoarece '*' este un factor de
repetitie, nu un caracter dintr-un sir. Pentru a dezactiva semnificatia
speciala a caracterului '*', trebuie sa-l prefixati cu un caracter
backslash: [0-9]\*[0-9].
Pentru a specifica faptul ca o expresie regulata corespunde numai unui
sub-sir care include anumite caractere la inceput, prefixati expresia
regulata cu un accent circumflex "^". De exemplu, expresia
regulata ^[sml]at corespunde sub-sirurilor "sat", "mat" sau "lat" numai
daca acestea apar la nceputul sirului subiect.
Similar, pentru a arata ca o expresie regulata corespunde numai unui
sub-sir care include anumite caractere la sfarsit, anexati la expresia
regulata un simbol al dolarului "$". De exemplu, expresia
regulata [sml]at$ corespunde sirurilor "sat", "mat" sau "lat" numai daca
acestea apar la sfrsitul sirului subiect.
Iata o lista cu mai multe caractere speciale si rolul lor in expresiile
regulate:
^ - indica inceputul liniei
$
- indica sfarsitul liniei
- (punct) orice caracter
[]
- un caracter dintre cele din paranezele patrate
[^]
\
- orice caracter, in afara celor din paranezele patrate
- scoate din contextul formari expresiei caracterul care urmeaza
- caracterul (expresia) anterior acestui semn se poate repeta odata si de
cate ori e posibil (de la 1 la infinit)
- caracterul (expresia) anterior acestui semn se poate repeta de cate ori e
posibil sau niciodate (de la 0 la infinit)
- caracterul (expresia) anterior acestui semn se poate repeta ce mult
odata
<>
(|)
- un cuvant intreg
- lista de optiuni SAU
{m, n}
- repetarea expresiei de la "m" la "n" ori
Iata cateva exemple de expresii regulate:
(.*)
- Reprezinta toate caracterele (prin .) repetate de cate ori e posibil (dat
de *)
<salut>
(ci|co)tim
- Cuvantul "salut"
- Reprezinta "citim" si "cotim"
^The .* hack$
- Sirurile care incep cu "the " si se sfarsesc cu " hack"
^www.[a-z0-9]+.ro$
- Reprezinta sirurile "www.---.ro" unde '---' poate fi
orice litera sau cuvant ce contine litere mici si numere
(^-\+[0-9]*)
- Orice numar care incepe cu "-" sau "+"
^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})$
Expresie regulata pentru adrese de e-mail
2. Utilizarea expresiilor regulate
PHP include numeroase functii care lucreaza cu expresii regulate.
Tabelul urmator descrie unele din aceste functii.
Functii PHP pentru expresii regulate
Functie
Descriere
ereg
- Executa o identificare cu o expresie regulata (anulata
incepand cu versiunea PHP 5.3)
- nlocuieste un sub-sir care corespunde unei expresii
ereg_repla
regulate (anulata incepand cu versiunea PHP 5.3 ce
in locul ei poate fi folosita preg_replace)
eregi
- Executa o identificare cu o expresie regulata
insensibila la diferenta ntre majuscule si minuscule
(anulata incepand cu versiunea PHP 5.3)
- nlocuieste un sub-sir care corespunde unei expresii
eregi_repl regulate insensibile la diferenta ntre majuscule si
ace
minuscule (anulata incepand cu versiunea PHP
5.3 - in locul ei poate fi folosita preg_replace)
- Cauta in sir caracterele sau sablonul care se potriveste
preg_repla
cu expresia regulata din functie si o inlocuieste cu alte
ce
valori date
split
- Divide un sir ntr-un tablou folosind o expresie regulata
(anulata incepand cu versiunea PHP 5.3 - in locul
ei poate fi folosita preg_split)
sql_regcas - Creaza o expresie regulata, insensibila la diferenta
e
ntre majuscule si minuscule, dintr-un sir care contine o
expresie regulata (anulata incepand cu versiunea
PHP 5.3)
In continuare este dat un exemplu cu functia ereg().
Forma simpla a functiei ereg() preia doua argumente: un sir care contine
o expresie regulata si un sir subiect. Functia returneaza TRUE daca
expresia regulata corespunde unui sub-sir al sirului subiect; n caz contrar,
returneaza FALSE.
- Iata un exemplu:
<?php
$model = "[sml]at";
$subiect = "La noi in sat";
$rezultat = ereg($model, $subiect);
if ($rezultat) {
echo 'Model inclus in subiect';
}
?>
- In acest script, variabila $rezultat primeste valoarea TRUE, deoarece
sirul 'subiect' contine sub-sirul "sat", care corespunde expresiei regulate.
Pentru verificare, instructiunea "if" verifica daca "$resultat" este TRUE si
in caz afirmativ executa comanda dintre acolade, "echo" care afiseaza
'Model inclus in subiect'.
- Pentru a verifica daca un sir contine numai litere si numere, puteti folosi
direct functia ctype_alnum()
- Deoarece functiile "ereg" au fost anulate incepand cu versiunea PHP 5.3,
este indicat sa nu le mai folositi, cunoasterea lor e necesara daca le
intalniti in scripturi mai vechi. Acestea au fost inlocuite cu functii "preg_"
(Perl-Compatible). Mai multe detalii si exemple despre aceste functii gasiti
in manualulExpresii regulate (compatibile Perl.
Expresiile regulate compatigile Perl se adauga intre caractere "/". De
exemplu sablonul ([a-z0-9]+) se foloseste /([a-z0-9]+)/.
Iata un exemplu cu preg_grep(), aceasta returneaza un array compus
din elementele unei matrice care contin sablonul, expresia regulata
cautata. Acest exemplu va returna doar acele elementele dintr-o matrice
care contin in ele sub-sirurile "casa" sau "masa".
<?php
$matrice = array('123casa', 'abc masa', '12-xy', '$asa_0/', '123abc casa');
$filtru = preg_grep("/([cm]asa)/", $matrice);
print_r ($filtru);
?>
// Afiseaza elementele matricei
- Variabila "$matrice" contine un Array cu mai multe elemente cu siruri.
- In variabila $filtru e preluat rezultatul functiei "preg_grep()" a carei prim
parametru este un sablon de expresie regulata (adaugata intre ghilimele
duble), iar al doilea este matricea in care e cautat sablonul.
- Cu functia "print_r()" se va afisa elementele matricei obtinute in
variabila "$filtru". Rezultatul afisat e urmatorul:
Array ( [0]=>123casa [1]=>abc masa [4]=>123abc casa )
- Un ultim exemplu util, folosim functia preg_replace() si o expresie
regulata pentru a elimina caracterelor speciale dintr-un sir
<?php
$sir = 'Sir& ce contine*a <caractere: speciale? /in co@nte>xt';
$sir = preg_replace("/([^ A-Za-z0-9_]+)/", "", $sir);
echo $sir;
?>
In acest exemplu avem un sir (stocat in variabila $sir) ce contine diferite
caractere mai putin uzuale.
Functia "preg_replace", impreuna cu expresia regulata "/(^ A-Za-z0-9_]
+)/", pastreaza in $sir numai literele, cifrele, caracterul '_' si spatiu.
Instructiunea "echo" va afisa urmatorul rezultat:
Sir ce continea caractere speciale in context
Utilizarea variabilelor cookie
nvatati care este modul de functionare a variabilelor cookie
nvatati sa creati, sa obtineti accesul la variabilele cookie si sa le stergeti
nvatati sa specificati optiunile dintr-o variabila cookie
1. Accesul la variabilele cookie
Valorile majoritatii variabilelor dispar atunci cnd scriptul PHP care le
contine si ncheie executia. Spre deosebire de acestea, valorile
variabilelor cookie se pot pastra un timp indefinit. Pentru ca valorile lor
sa se poata pastra, browserul utilizatorului stocheaza variabilele cookie
n unitatea de hard-disc a utilizatorului.
Majoritatea navigatoarelor de Web au posibilitatea sa
activeze/dezactiveze cookie-urile. Trebuie sa tineti cont de acest lucru
cand doriti sa folositi cookie in scripturile dv., totusi, comform
statisticilor, in jur de 1% dintre utilizatori au optiunea cookie dezactivata.
PHP pune la dispozitia utilizatorilor functii pentru transmiterea cookieurilor de la server la browser, si modalitati de citire a cookie-urilor.
Pentru a citi cooki-urile puteti utiliza variabila PHP de tip
tablou $_COOKIE sau $_HTTP_COOKIE_VARS, acestea contin numele
si valoarea fiecarei variabile cookie curenta. Daca doriti sa obtineti acces
la acest tablou, puteti folosi un program ca urmatorul:
Foreach($_COOKIE as $nume => $valoare)
echo "<br /> $nume => $valoare";
- $_COOKIE['numeCookie'] este o variabila super-globala, putand fi
accesata si in functii fara a mai specifica "global".
2. Crearea unei variabile cookie
Un lucru important de retinut este faptul ca cookie-urile trebuie sa fie
transmise la browser inaintea oricarei alte informatii.
Pentru a evita problemele, asigurati-va ca un script PHP care stabileste o
valoare a unei variabile cookie este plasat n partea superioara a
fisierului, fara caractere de tip spatiu alb care sa-l preceada. De
asemenea, stabiliti valoarea variabilei cookie nainte de a executa o
instructiune 'echo' sau o alta instructiune PHP care trimite browserului
date de iesire.
Pentru a crea o variabila cookie, folositi functia setcookie(), care are
urmatoarea forma:
setcookie(numeCookie, valoare, expirare)
- Argumentul 'numeCookie' specifica numele variabilei cookie, iar
argumentul 'valoare' specifica valoarea variabilei.
- Valoarea variabilei cookie este automat transmisa "urlencode" si cand
este primita e automat decodata.
- Argumentul 'expirare' indica momentul expirarii variabilei cookie; dupa
ora specificata, variabila cookie nu mai este accesibila.
n general, este convenabil sa se specifice momentul expirarii folosind
functia time(), care returneaza intervalul de timp (exprimat n secunde)
scurs de la 1 ianuarie 1970. Puteti adauga o valoare de tip decalaj
(offset), care specifica intervalul de timp pe durata caruia variabila cookie
trebuie sa fie accesibila.
Folosind aceasta functie se pot transmite mai multe cookie-uri succesiv;
protocoalele Web limiteaza insa la maximum 20 numarul cookie-urilor ce
pot fi trimise aceluiasi utilizator.
De exemplu, sa luam n considerare urmatoarea instructiune:
setcookie("fruct", "banana", time()+3600);
Aceasta instructiune creeaza o variabila cookie denumita 'fruct', care are
valoarea 'banana'. Variabila cookie va fi disponibila timp de o ora (3600
secunde) de la crearea sa.
Daca preferati, puteti specifica momentul expirarii folosind
functia mktime(). Aceasta functie are urmatoarea forma:
mktime(ore, minute, secunde, luna, zi, an)
De exemplu, urmatoarea instructiune creeaza o variabila cookie care
expira la o secunda dupa miezul noptii primei zile a anului 2009:
Setcookie("fruct", "banana", mktime(0, 0, 1, 1, 1, 2009));
3. Stergerea unei variabile cookie
Deoarece o variabila cookie are o data de expirare, aceasta va fi
stearsa automat la un oarecare interval de timp dupa crearea sa. Totusi,
puteti sterge o variabila cookie imediat. Pentru aceasta, fixati momentul
expirarii variabilei cookie la un moment de timp in trecut.
De exemplu, pentru a sterge o variabila cookie denumita 'fruct', puteti
folosi urmatoarea instructiune:
setcookie("fruct", "", time()-3600);
Aceasta instructiune stabileste timpul de expirare cu o ora (3600 de
secunde) n urma.
Remarcati ca valoarea variabilei cookie este exprimata sub forma unui sir
vid (""); din moment ce variabila cookie nu va mai fi disponibila, valoarea
sa nu mai are importanta.
4. Specifi carea accesului la o variabila cookie si alte
optiuni
Functia setcookie() poate prelua maximum sase argumente.
Iata formatul complet al functiei setcookie():
setcookie(nume, valoare, expirare, cale, domeniu, secure)
Argumentele 'nume', 'valoare' si 'expirare' au fost descrise n sectiunea
precedenta.
- Argumentul 'cale' va permite sa specificati calea URL asociata variabilei
cookie. n mod prestabilit, variabila cookie este disponibila pentru
scripturile din catalogul care contine scriptul n care a fost configurata
variabila respectiva, precum si pentrul scripturile din sub-cataloagele
aferente catalogului respectiv. n particular, scripturilor din cataloagele
parinte ale catalogului care contine scriptul nu li se permite accesul
prestabilit la variabila cookie.
Pentru a pune variabila cookie la dispozitia scripturilor dintr-un anumit
catalog si cataloagele sale, specificati o valoare a argumentului 'cale'. De
exemplu, pentru a pune variabila cookie la dispozitia ntregului arbore de
cataloage, specificati " /" ca valoare a argumentului cale; pentru a face
variabila cookie disponibila n catalogul "/test" si n sub-cataloagele sale,
specificati "/test/" ca valoare a argumentului 'cale'.
- Daca nu este specificat nici un argument 'domeniu', o variabila cookie
este disponibila numai pentru scripturile din domeniul Web care a creat
variabila respectiva. Argumentul 'domeniu' va permite sa specificati
numele de domeniu asociat unei variabile cookie. n consecinta, variabila
cookie va fi disponibila numai pentru siturile Web din cadrul domeniului
specificat. De exemplu, sa presupunem ca un script din serverul
Web[Link] creeaza o variabila cookie. n
mod prestabilit, variabila cookie este disponibila numai pentru gazda
respectiva. Cu toate acestea, puteti face variabila cookie disponibila pe
ntreg domeniul '[Link]', specificnd
"[Link]" ca valoare a argumentului 'domeniu'.
- Argumentul 'secure' este o valoare ntreaga, care specifica daca
variabila cookie trebuie trimisa prin intermediul unei conexiuni sigure
(HTTPS). Specificati valoarea l pentru a mpiedica transmiterea variabilei
cookie n cazul n care conexiunea nu este sigura; pentru a permite
transmiterea variabilei cookie prin conexiuni HTTP obisnuite, specificati
valoarea 0.
Lucrul cu fisiere (1)
Invatati sa obtineti atributele unui fisier
Invatati despre privilegiile unui fisier si utilizarea acestora
Invatati sa deschideti si sa inchideti fisiere
1. Obtinerea atributelor unui fi sier
Privilegiile asociate unui fisier sau unui catalog determina operatiile pe
care le poate executa un utilizator cu fisierul sau catalogul respectiv.
Pentru a adauga un fisier intr-un director, folosind PHP, trebuie sa aveti
permisiunea de scriere in acel director, de asemenea, pentru a adauga
date intr-un fisier, trebuie sa aveti permisiunea de scriere in fisierul
respectiv.
Aceste permisiuni sunt date (configurate) de administratorul sistemului
respectiv.
PHP furnizeaza numeroase functii care va permit sa obtineti informatii
care descriu un fisier. Tabelul urmator rezuma cele mai cunoscute dintre
aceste functii.
Functii PHP pentru obtinerea atributelor unui fisier
Functie
Descriere
file_exists - Returneaza TRUE daca fisierul specificat exista, respectiv
()
FALSE n caz contrar
fileatime( - Returneaza timpul de acces la fisier sub forma de
)
amprenta de timp UNIX.
filectime( - Returneaza timpul de modificare al i-nodului (structura
)
de date care contine informatii despre fisiere UNIX - N. T.)
sub forma de amprenta de timp UNIX.
filegroup( - Returneaza identificatorul numeric al grupului care detine
)
fisierul
filemtime - Returneaza momentul de timp al modificarii fisierului sub
()
forma de amprenta de timp UNIX
fileowner( - Returneaza identificatorul numeric de utilizator al
)
fisierului
fileperms
- Returneaza permisiunile fisierului
()
filesize() - Returneaza dimensiunea fisierului, n octeti
filetype()
- Returneaza tipul fisierului, n speta "fifo", "char", "dir",
"block", "link", "file" sau "unknown"
is_dir()
- Returneaza TRUE daca directorul specificat exista; n caz
contrar, returneaza FALSE
is_file()
- Returneaza TRUE daca fisierul specificat exista; n caz
contrar, returneaza FALSE
is_readab - Returneaza TRUE daca fisierul specificat exista si poate fi
le()
citit; n caz contrar, returneaza FALSE
is_writabl - Returneaza TRUE daca fisierul specificat exista si se
e()
poate scrie n acel fisier; n caz contrar, returneaza FALSE
Functiile fileowner() si filegroup() returneaza fiecare un identificator
numeric; puteti converti identificatorul numeric ntr-un sir prin invocarea
functieiposix_getpwuid() cu un identificator de utilizator, respectiv a
functiei posix_getgrgid() cu un identificat de grup. Acestea returneaza
informatii despre identificatorul precizat.
Iata un exemplu in care puteti vedea, si intelege mai bine, cum sunt
folosite functiile rezentate in tabelul anterior (fisierul '[Link]' care va fi
folosit de functii se afla in acelasi director cu scriptul php):
<?php
$filename = "[Link]";
$result = file_exists($filename);
echo "<br /> file_exists(): $result";
$result = fileowner($filename);
echo "<br /> fileowner(): $result";
$result = filegroup($filename);
echo "<br /> filegroup(): $result";
$result = filetype($filename);
echo "<br /> filetype(): $result";
$result = filesize($filename);
echo "<br /> filesize(): $result";
$result = fileatime($filename);
$result = date("m/d/Y H:i", $result);
echo "<br /> fileatime(): $result";
$result = filectime($filename);
$result = date("m/d/Y H:i", $result);
echo "<br /> filectime(): $result";
$result = filemtime($filename);
$result = date("m/d/Y H:i", $result);
echo "<br /> filemtime(): $result";
$result = fileperms($filename);
$result = decoct($result);
echo "<br /> fileperms(): $result";
$result = is_file($filename);
echo "<br /> is_file(): $result";
$result = is_dir($filename);
echo "<br /> is_dir(): $result";
$result = is_readable($filename);
echo "<br /> is_readable(): $result";
$result = is_writable($filename);
echo "<br /> is_writable(): $result";
?>
Datele de iesire ale exemplului sunt urmatoarele
file_exists(): 1
fileowner(): 0
filegroup(): 0
filetype(): file
filesize(): 5
fileatime(): 08/28/2008 00:00
filectime(): 08/28/2008 10:49
filemtime(): 08/28/2008 11:32
fileperms(): 100666
is_file(): 1
is_dir():
is_readable(): 1
is_writable(): 1
- O lista cu mai multe functii utile in lucrul cu fisiere gasiti la pagina
-> Functii pentru fisiere si directoare.
2. Privilegii de fi sier
Privilegiile asociate unui fisier (sau director) determina operatiile pe
care utilizatorii le pot efectua cu fisierul (sau directorul) respectiv. =
Privilegiile sunt date sub forma a trei grupuri alcatuite din cte trei
caractere fiecare; cu alte cuvinte, trei triade. Prima triada indica
privilegiile acordate posesorului fisierului. Cea de-a doua triada indica
privilegiile acordate membrilor grupului posesor al fisierului. Cea de-a
treia triada indica privilegiile acordate altor utilizatori.
Cele 3 caractere care alcatuiesc un grup sunt reprezentate, in sistemele
UNIX, prin urmatoarele tri litere: 'r', 'w' si 'x'; acestea reprezinta:
r - fisierul poate fi citit
w - se poate scrie n fisier
x - continutul fisierului poate fi executat
Caracterele unei triade apar ntotdeauna n secventa 'rwx'. Daca o
anumita litera este nlocuita de o cratima (-), privilegiul asociat nu este
accesibil.
De exemplu, sa examinam privilegiile specificate in urmatorul exemplu:
rwxr-xr--
Aceste caractere au urmatoarea semnificatie:
"rwx", posesorul fisierului poate citi, scrie sau executa fisierul
"r-x", membrii grupului posesor al fisierului pot citi sau executa fisierul, dar nu
pot scrie n fisier
"r--", alti utilizatori pot citi fisierul, dar nu pot scrie n fisier sau executa
continutul fisierului
Privilegiul 'x' este semnificativ numai pentru fisierele care includ un continut executabil,
cum sunt fisierele binare executabile (.exe) sau anumite categorii de scripturi.
Posesorul unui fisier poate modifica privilegiile asociate fisierului
emitnd comanda chmod (aceasta functioneaza in sistemele de operare
UNIX).
Aceasta comanda are doua forme. O forma va permite sa specificati
privilegiile folosind cifre scrise n octal; cealalta va permite sa le
specificati folosind litere.
Pentru a specifica privilegiile folosind cifre n octal, calculati valoarea
numerica a fiecarei triade. Pentru aceasta, nsumati numerele
corespunzatoare fiecarui privilegiu disponibil din cadrul triadei. Numerele
asociate privilegiilor sunt urmatoarele:
r - 4
w-2
x-1
De exemplu, privilegiul "rwx" are valoarea 4 + 2 + 1 = 7. Similar,
privilegiul "r-x" are valoarea 4 + l = 5, iar privilegiul "r--" are valoarea 4.
Dupa ce ati calculat valoarea numerica a fiecarei triade, formati un numar
din trei cifre scris n octal, care este alcatuit din valoarea numerica a
privilegiilor utilizatorilor, valoarea numerica a privilegiilor membrilor
grupului, si valoarea numerica a privilegiilor altor utilizatori. Astfel,
privilegiile "rwxr-xr--" corespund valorii n octal 754.
3. Modifi carea privilegiilor unui fi sier
Pentru a modifica privilegiile unui fisier, folositi functia chmod(), care
are urmatoarea forma:
chmod(nume_fisier, mod)
Argumentul 'nume_fisier' specifica numele si calea de acces a fisierului
ale carui privilegii urmeaza a fi modificate, iar argumentul 'mod' specifica
privilegiile dorite, n general, se prefera exprimarea privilegiilor sub forma
unui numar scris n octal. Pentru aceasta, prefixati valoarea folosind cifra
0.
De exemplu, puteti atribui unui fisier "[Link]" privilegiile "rwxr-xr--"
specificnd pentru 'mod' valoarea 0754, functia "chmod" va
fi chmod("[Link]", 0754)
Pentru ca functia chmod() sa se execute cu succes, PHP trebuie sa ruleze
sub contul utilizatorului posesor al fisierului. Functia returneaza TRUE n
caz de reusita, respectiv FALSE n caz contrar.
Pentru a modifica grupul posesor al unui fisier, invocari functia chgrp(),
care are forma:
chgrp("nume_fifier", grup)
- Unde "grup" este un nume sau numar care desemneaza grupul
respectiv.
Functiile chmod() si chgrp() nu functioneaza sub Microsoft Windows.
4. Deschiderea unui fi sier
Inainte de a putea citi sau scrie ntr-un fisier, trebuie sa deschideti
fisierul folosind functia fopen().
fopen("nume_fisier", "mod")
- unde 'nume_fisier' specifica numele si calea spre fisierul care urmeaza a
fi deschis, iar 'mod' indica tipul de acces dorit.
Modurile de deschidere a unui fisier sunt urmatoarele:
r - Permite doar citirea fisierului
r+ - Citire sau scriere de la inceputul fisierului
w - Creaza fisierul daca nu exista si suprascrie datele existente
w+ - Citire sau scriere; la scriere , creeaza fisierul daca nu exista si
suprascrie datele existente
a - Adaugare; Creaza fisierul daca nu exista si adauga datele noi la sfarsitul
fisierului existent
a+ - Citire sau scriere; la scriere, creaza fisierul daca nu exista si adauga
datele noi la sfarsitul fisierului existent
x - Doar scriere; Creaza fisierul daca nu exista si genereaza un averisment
daca acesta exista
x+ - Citire sau scriere; Creaza fisierul daca nu exista si genereaza un
averisment daca acesta exista
b - Deschide fisierul in mod binar
Functia fopen() returneaza FALSE daca PHP nu a reusit sa deschida
fisierul, n caz contrar, returneaza o valoare care contine un ntreg, numit
"identificator de fisier", care se foloseste pentru identificarea unui fisier de
catre functiile care executa operatii cu fisiere.
De exemplu, instructiunea urmatoare deschide fisierul '[Link]' pentru
citire:
$fh = fopen("[Link]", "r");
Sub Microsoft Windows, fisierele ASCII si fisierele binare sunt tratate n
mod diferit. Cnd deschideti un fisier binar sub Windows, specificati "b" ca
al doilea caracter al modului; de exemplu, "rb" pentru citire, "wb" pentru
scriere, "a+b" pentru citire si adaugare. Daca nu procedati astfel, citirile
din fisier si alte operatii se vor ncheia prematur sau vor esua.
5. Verifi carea fi nalizarii unei operatii cu un fi sier
Operatiile cu fisiere (inclusiv cele legate de deschiderea, citirea unui
fisier si scrierea ntr-un fisier) pot esua dintr-o varietate de motive. Deci,
este important sa verificati daca fiecare operatie s-a ncheiat cu succes.
Iata o modalitate n care puteti proceda:
<?php
$fh = fopen("[Link]", "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul [Link].";
}
?>
Functia fopen() returneaza FALSE daca nu reuseste sa deschida fisierul.
In acest caz, scriptul executa instructiunea echo care afisaza un mesaj.
O forma alternativa mai simpla foloseste operatorul OR (SAU):
<?php
($fh = fopen("[Link]", "rb"))
OR die("Nu a fost deschis fisierul [Link].");
?>
6. Inchiderea unui fi sier
Un fisier deschis consuma resursele sistemului. Cnd un script a
terminat de utilizat un fisier, scriptul trebuie sa nchida fisierul, elibernd
aceste resurse.
La sfrsitul unui script, PHP nchide n mod automat fisierele deschise.
Totusi, la programare se recomanda sa nchideti fisierele mai rapid, ori
de cte ori este posibil.
Pentru a nchide un fisier, folositi functia fclose():
fclose(identificator_fisier)
- 'identificator_fisier' este identificatorul fisierului, returnat la deschiderea
acestuia cu functia fopen()
Iata un exemplu caracteristic de deschidere, utilizare si nchidere a unui
fisier:
<?php
$fh = fopen("[Link]", "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul [Link].";
}
// Aici se insereaza instructiunile care folosesc fisierul deschis
fclose($fh);
?>
Functia fclose() returneaza valoarea TRUE daca fisierul a fost nchis cu succes.
Testarea acestei valori este rareori necesara, deoarece nu se mai pot face prea multe
dupa ce s-a ratat o ncercare de a nchide un fisier.
Lucrul cu fisiere (2)
nvatati sa cititi datele dintr-un fisier
nvatati sa afisati continutul unui fisier
nvatati sa scrieti date intr-un fisier
1. Citirea dintr-un fi sier
PHP furnizeaza o varietate de functii pentru citirea fisierelor. Una dintre
acestea este fread(), care are urmatoarea forma:
fread(identificator_fisier, lungime)
Argumentul 'identificator_fisier' este valoarea returnata de
functia fopen(), iar argumentul 'lungime' specifica numarul maxim de
octeti care vor fi cititi. Octetii cititi din fisier sunt returnati sub forma de
valoare de tip sir. Daca operatia de citire ntlneste sfrsitul fisierului,
PHP va returna mai putin de lungime octeti data.
Iata un exemplu de citire si de afisare a unui text dintr-un fisier, folosind
functia fopen() (Fisierul "[Link]" folosit ca test in exemplele de mai
jos trebuie sa se afle in acelasi director in care este si scriptul php):
<?php
$fh = @fopen("[Link]", "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul [Link].";
}
else {
$s = fread($fh, 256);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
Exemplul citeste maximum 256 de octeti din fisier daca fisierul a fost
deschis.
- Am folosit caracterul @ in fata functiei "fopen()" pentru a impedica
afisarea erorilor de la server in cazul cand fisierul nu poate fi deschis.
Este deja functia "if()" care verifica si afiseaza mesaj in caz de
nedeschidere a fisierului.
Pentru a citi un numar mai mare sau mai mic de octeti, modificati
valoarea argumentului lungime al functiei fread().
PHP include o functie conexa, denumita fgetc(), care citeste un octet din fisierul
specificat.
Pentru a citi si a afisa ntregul continut al fisierului, puteti folosi
functia filesize() pentru a furniza valoarea argumentului lungime, astfel:
<?php
$nume = "[Link]";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul [Link].";
}
else {
$l = filesize($nume);
$s = fread($fh, $l);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
2. Citirea unei linii de text
Se obisnuieste frecvent citirea linie cu linie a unui text dintr-un fisier.
Functia fgets() citeste o linie dintr-un fisier; functia are urmatoarea
forma:
fgets(identificator_fisier, lungime)
- Argumentul 'identificator_fisier' este o valoare returnata de
functia fopen(); aici, argumentul 'lungime' specifica numarul maxim de
octeti dintr-o linie care vor fi cititi, minus o unitate, pentru a permite
includerea caracterului de terminare a liniei (acesta poate fi omis si va
citi toata linia). Octetii cititi din fisier sunt returnati ca valoare de tip sir.
Iata un exemplu care prezinta modul de citire si de afisare a primilor 125
octeti din prima linii a unui fisier :
<?php
$nume = "[Link]";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul [Link].";
}
else {
$s = fgets($fh, 126);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
- In exemplul de mai sus, daca prima linie din fisierul "[Link]" are mai
mult de 125 de caractere, va afisa doar primele 125, daca are mai putin
de 125 de caractere, va afisa doar caracterele care sunt incluse in prima
linie.
3. Citirea linie cu linie a unui ntreg fi sier
n general, dintr-un fisier trebuie citit mai mult dect prima linie a
acestuia. Pentru aceasta, un script trebuie sa dispuna de o modalitate de
a determina momentul cnd fisierul a fost citit n totalitate.
Functia feof() are chiar acest scop, returnnd o valoare care arata daca
s-a ajuns sau nu la sfrsitul fisierului. Functia are urmatoarea forma:
feof(identificator_fisier)
Argumentul 'identificator_fisier' este valoarea returnata de
functia fopen().
Functia feof() returneaza TRUE daca fisierul specificat este la sfrsit; n
caz contrar, returneaza FALSE.
Iata cum se poate folosi functia feof() pentru a controla procesul de
citire a unui ntreg fisier, linie cu linie:
<?php
$nume = "[Link]";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Fisieru [Link] nu a putut fi deschis";
}
while (!feof($fh)) {
$s = fgets($fh, 256);
echo "<br /> Citeste : $s";
}
fclose($fh);
?>
- Instructiunea "while" asigura faptul ca functia fgets() este apelata n
mod repetat, pna la citirea tuturor liniilor.
O alta modalitate simpla de a citi linie cu linie un ntreg fisier consta n a
folosi functia file(). Aceasta functie returneaza un tablou n care fiecare
element contine o linie a fisierului specificat.
Iata un exemplu care foloseste functia file() pentru a citi si pentru a afisa
continutul unui fisier:
<?php
$tablou = file("[Link]");
foreach ($tablou as $s) {
echo "<br /> Citeste : $s";
}
?>
Aceasta metoda nu este adecvata pentru fisiere de foarte mari dimensiuni, deoarece n
tablou este ncarcat ntregul continut al fisierului, ceea ce poate necesita o cantitate de
memorie superioara celei disponibile.
4. Afi sarea continutului unui fi sier
PHP furnizeaza doua functii care faciliteaza afisarea continutului unui
fisier.
- Una dintre functii, fpassthru(), necesita un argument care specifica
identificatorul fisierului care urmeaza sa fie afisat:
$fh = fopen("[Link]", "rb");
fpassthru($fh);
Dupa ce a afisat fisierul, functia l nchide automat.
- Cealalta functie, readfile(), necesita numai numele sau calea fisierului:
readfile("[Link]");
5. Navigarea printr-un fi sier
Fiecare fisier are un pointer asociat care indica pozitia octetului unde se
va produce urmatoarea operatie.
Puteti folosi functia rewind() pentru a readuce pointerul la nceputul
fisierului. Functia are urmatoarea forma ('identificator_fisier' este
identificatorul de fisier returnat de functia fopen()):
rewind(identificator_fisier)
Nu puteti readuce pointerul unui fisier la nceputul propriu-zis al unui fisier daca fisierul
a fost deschis pentru un acces de tip atasare, adica ntr-unul din modurile 'a' sau 'a+'.
Iata un exemplu care prezinta modul de utilizare a
functiei rewind() pentru a afisa de doua ori continutul unui fisier:
<?php
$nume = "[Link]";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Fisieru [Link] nu a putut fi deschis";
}
while (!feof($fh)) {
$s = fgets($fh, 256);
echo "<br /> Citeste : $s";
}
// Deruleaza la inceputul fisierului si reia redarea acestuia
rewind($fh);
while (!feof($fh)) {
$s = fgets($fh, 256);
echo "<br /> Citeste \$s : $s";
}
fclose($fh);
?>
Daca se produce vreo eroare, functia rewind() returneaza zero.
Desi functia rewind() este utila n caz de nevoie, necesitatea de a
readuce un pointer de fisier la nceputul fisierului nu este chiar att de
frecventa.
Functia fseek() furnizeaza o mai mare flexibilitate, permitndu-va sa
pozitionari pointerul de fisier astfel nct sa puteti citi sau scrie n orice
punct al fisierului.
Functia are doua forme, cea mai simpla fiind urmatoarea:
fseek(identificator_fisier, offset)
unde 'identificator_fisier' este identificatorul de fisier returnat de functia
fopen(), iar 'offset' este pozitia dorita a pointerului de fisier, specificata n
octeti, n raport cu nceputul fisierului.
In caz de reusita, functia fseek() returneaza 0; n caz contrar, returneaza
-l .
O forma alternativa a functiei asigura un grad superior de flexibilitate,
avand urmatoarea forma:
fseek(identificator_fisier, offset, baza)
unde 'identificator_fisier' si 'offset' au semnificatiile definite anterior, iar
'baza' ia una ; dintre urmatoarele valori:
SEEK_SET, care stabileste pozitia pointerului de fisier n raport cu nceputul
fisierului
SEEK_CUR, care stabileste pozitia pointerului de fisier n raport cu valoarea
curenta a pointerului
SEEK_END, care stabileste pozitia pointerului de fisier relativ la sfrsitul
fisierului
Valoarea argumentului 'offset' poate fi pozitiva, negativa sau zero.
De exemplu, pentru a pozitiona pointerul cu 1000 de octeti nainte de
sfrsitul fisierului, emiteti urmatorul apel de functie:
fseek($fh, -1000, SEEK_END)
Pentru a obtine valoarea curenta a pointerului de fisier, folositi
functia ftell(), care are urmatoarea forma:
ftell(identificator_fisier)
Functia returneaza valoarea curenta a identificatorului de fisier, respectiv
valoarea zero daca functia esueaza.
6. Scrierea ntr-un fi sier
Pentru a scrie intr-un fisier se foloseste functia fwrite(), aceasta are
urmatoarea forma:
fwrite(identificator_fisier, date);
- Unde 'identificator_fisier' este identificatorul de fisier returnat de
functia fopen(), iar 'date' este o valoare sir care determina datele care
urmeaza a fi scrise.
Daca executia functiei reuseste, returneaza numarul octetilor scrisi; n
caz contrar, returneaza valoarea l.
Iata un exemplu care prezinta modul de scriere a datelor ntr-un fisier:
<?php
$nume = "[Link]";
$fh = @fopen($nume, "ab");
if (!$fh) {
echo "Nu a fost deschis fisierul [Link].";
}
else {
$ok = fwrite($fh, "Acestea sunt datele adaugate \n");
echo "<br /> Rezultatul scris este: $ok";
fclose($fh);
}
?>
Acest script va avea urmatoarele date de iesire:
Rezultatul scris este: 30
- Programul prezentat n exemplul anterior scrie n fisierul "[Link]" o
linie de text. Deoarece fisierul a fost deschis folosind modul "a", datele
sunt atasate la fisier; cu alte cuvinte, datele sunt scrise la sfarsit, dupa
toate datele existente n fisier.
Observati ca a fost scris si un caracter de terminare a liniei ("\n"), astfel
nct fisierul sa poata fi citit linie cu linie la un moment de timp ulterior.
Daca lucrati cu un fisier text, n general e util sa includeti un caracter de
terminare a liniei la sfrsitul fiecarei linii scrise n fisier.
Programul din exemplu scrie n fisier o singura linie de text. Totusi, puteti
scrie mai multe linii, daca doriti. Daca apelati functia fwrite() din
interiorul unei bucle, aveti posibilitatea de a scrie mai multe linii. Dupa ce
ati scris toate liniile de care aveti nevoie, nchideti fisierul prin apelarea
functiei fclose().
PHP mai furnizeaza si o forma alternativa a functiei fwrite():
fwrite(identificator_fisier, date, lungime);
Aceasta forma include un al treilea argument, si anume "lungime", care
va permite sa specificati numarul maxim de octeti care vor fi scrisi.
Argumentul "lungime" al functiei fwrite() trebuie utilizat atunci cnd se scrie n fisiere
binare sub Microsoft Windows.
Windows prefera secventa de terminare a liniei "\r\n". Atunci cnd scrieti programe PHP
pentru sisteme Windows, este de preferat sa folositi secventa "\r\n" de terminare a liniei.
- PHP dispune de o alta functie pentru scrierea fisierelor, fputs(). Totusi, n afara de
nume, fputs() este similara cu functia fwrite().
- O lista cu mai multe functii utile in lucrul cu fisiere gasiti la pagina
-> Functii pentru fisiere si directoare.
Lucrul cu fisiere (3)
Invatati sa blocati si sa obtineti accesul exclusiv la un fisier
Invatati sa copiati, sa redenumiti si sa stergeti un fisier
Studiati un script PHP util pentru incarcarea de fisiere in server
1. Obtinerea accesului exclusiv la un fi sier
Web-ul ridica o problema speciala pentru dezvoltatorii de programe,
deoarece mai multi utilizatori pot avea acces simultan la un singur script
PHP. Uneori, accesul simultan poate avea ca rezultat date incorecte.
Pentru a vedea cum se poate produce aceasta, sa luam n considerare
urmatorul script, care reprezinta un contor pentru numarul de deschideri
a unei pagini.
<?php
$contor = "[Link]";
$fh = @fopen($contor, "r+b");
if (!$fh) {
echo "Nu a fost deschis fisierul [Link].";
}
else {
$s = fgets($fh, 7);
$count = (int) $s;
$count = $count + 1;
rewind($fh);
fwrite($fh, $count);
echo "<br /> Nr. vizitari: $count";
fclose($fh);
}
?>
Remarcati functiile pe care le foloseste scriptul pentru a executa operatiile
cu fisiere. Programul deschide fisierul "[Link]" pentru citire si scriere,
preia datele din acesta, care sunt un numar intreg, mareste acel numar cu
o unitate, intoarce pointerul la inceputul fisierului "rewind" dupa care
rescrie noul numar, afiseaza numarul si inchide fisierul.
Secventa de cod descrisa mai sus poate creea probleme in cazul in care,
de exemplu doi utilizatori diferiti acceseaza acelasi fisier, in acelasi timp,
cand contoarul este, de exemplu, la numarul 100. Amandoi vor
incrementa numarul 100 cu o unitate si va rescrie in fisierul "[Link]" 101;
in final, contoarul va arata 101, in loc de 102 cum ar fi trebuit (deoarece
au fost 2 vizitatori).
Pentru a evita astfel de conflicte PHP pune la dispozitia utilizatorilor o
metoda prin care se poate bloca accesul temporar la un fisier. Pe durata
blocarii, un alt utilizator nu va mai putea scrie/citi din acest fisier. De
aceea durata blocarii trebuie sa fie limitata.
Functia care realizeaza blocarea este flock(), care are urmatoarea forma:
flock(identificator_fisier, operatie)
- Unde "identificator_fisier" este identificatorul de fisier returnat de functia
fopen(). Argumentul "operatie" este o constanta sau o expresie care
poate avea urmatoarele valori:
LOCK_SH - Blocare partajata in scopuri de citire
LOCK_EX - Blocare exclusiva in scopuri de scriere
LOCK_NB - Blocare fara fixare
LOCK_UN - Eliminarea blocarii
Iata cum se foloseste procesul de blocare, vom folosi acelasi exemplu,
contoarul de mai sus, de data aceasta imbunatatit.
<?php
$contor = "[Link]";
$fh = @fopen($contor, "r+b");
if (!$fh) {
echo "Nu a fost deschis fisierul [Link].";
}
else {
flock($fh, LOCK_EX);
$s = fgets($fh, 7);
$count = (int) $s;
$count = $count + 1;
rewind($fh);
fwrite($fh, $count);
flock($fh, LOCK_UN);
echo "<br /> Nr. vizitari: $count"
fclose($fh);
}
?>
- De data aceasta scriptul blocheaza fisierul "[Link]" pe timpul citirii si
scrierii acestuia, astfel nct accesul simultan sa nu cauzeze o numarare
eronata.
Blocare se face imediat dupa ce a fost deschis fisierul, cu "LOCK_EX", si se
incheie imediat dupa rescrierea in fisier, prin deblocare acestuia
"LOCK_UN".
2. Copierea unui fi sier
O functie care faciliteaza copierea fisierelor, este copy().
Functia copy() are urmatoarea forma:
copy (sursa, destinatiea)
Unde "sursa" este numele si calea fisierului care urmeaza a fi copiat, iar
"destinatie" este numele sau calea copiei.
Functia returneaza TRUE daca operatia de copiere reuseste; n caz
contrar, returneaza FALSE.
Iata un exemplu n care este prezentat modul de utilizare a
functiei copy():
<?php
$ok = copy("[Link]", "[Link]");
if (!$ok) {
echo "Copierea nu a reusit.";
}
?>
Exemplul creeaza o copie a fisierului "[Link]", cu numele "[Link]",
in acelasi director.
Functia copy() va suprascrie fisierul destinatie, daca acesta exista.
3. Modifi carea numelui unui fi sier
Functia care va permite sa modificati numele unui fisier
este rename(), aceasta care are urmatoarea forma:
rename(nume_vechi, nume_nou)
Unde "nume_vechi" este numele si calea originala a fisierului, iar
"nume_nou" este numele dorit.
Functia returneaza TRUE daca operatia de modificare a numelui a reusit;
n caz contrar, returneaza FALSE.
Iata un exemplu de utilizare a functiei rename():
<?php
$ok = rename("[Link]", "[Link]");
if (!$ok) {
echo "Modificarea numelui nu a reusit.";
}
?>
- Exemplu modifica numele fisierului "[Link]" in "[Link]".
4. Stergerea unui fi sier
Functia care va permite sa stergeti un fisier este unlink(), aceasta care
are urmatoarea forma:
unlink(nume_fisier)
Unde "nume_fisier" este numele si calea fisierului care va fi sters.
Functia returneaza TRUE daca operatia de stergere a reusit; n caz
contrar, returneaza FALSE.
Iata un exemplu de utilizare a functiei unlink():
<?php
$ok = unlink("[Link]");
if (!$ok) {
echo "Stergerea fisierului nu a reusit.";
}
?>
- Exemplu sterge fisierului "[Link]".
Retineti ca PHP trebuie sa aiba acces de scriere la catalogul n care se vor executa
operatiile de copiere, redenumire sau stergere; n caz contrar, PHP nu va putea executa
aceste operatii.
5. Incarcarea unui fi sier in server
Pentru incarcarea unui fisier in server, se folosesc formulare HTML
impreuna cu un script PHP de incarcare care foloseste
functiamove_uploaded_file() pentru operatia de upload.
Pentru a crea un formular de ncarcare,
specificati ENCTYPE="multipart/form-data" n eticheta FORM si
includeti un control de introducere a datelor cu atributul TYPE="FILE".
Iata un exemplu de script PHP si formular HTML care incarca fisierele in
server:
<?php
if(isset($_POST['submit'])) {
$uploadpath = "upload/";
// Modifica aici directorul de upload
$uploadpath = $uploadpath . basename( $_FILES['fisier']['name']);
if(move_uploaded_file($_FILES['fisier']['tmp_name'], $uploadpath)) {
echo"Fisier: ". basename( $_FILES['fisier']['name']). " a fost incarcat";
}
else {
echo "Eroare la urcarea fisierului pe server, mai incerca o data!";
}
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"
enctype="multipart/form-data">
Alege fisierul:
<input type="file" name="fisier" /> <br />
<input type="submit" name='submit' value="Trimite" />
</form>
- Cnd utilizatorul apasa pe butonul de "Trimite", scriptul PHP preia datele
si va incarca fisierul dorit in server
- O lista cu mai multe functii utile in lucrul cu fisiere gasiti la pagina
-> Functii pentru fisiere si directoare.
Utilizarea cataloagelor (Directoare)
Invatati sa obtineti si sa modificati directorul de lucru curent
Invatati sa manipulati caile de acces si privilegiile la un director
Invatati sa cititi continutul unui director, sa-l redenumiti si sa creati noi
directoare
Cele mai importante functii pentru utilizarea cataloagelor va permit sa
obtineti catalogul de lucru si sa lucrati cu acesta, sa manipulati cai de
acces, sa cititi continutul unui director, sa vizualizati si sa modificati
privilegiile unui director, precum si sa creati si sa stergeti cataloage.
In acest context, numele "catalog" si "director" reprezinta acelasi lucru.
1. Obtinerea si modifi carea directorului de lucru
Functia getcwd() returneaza numele catalogului curent de lucru.
Functia nu necesita argumente si poate fi utilizata astfel:
$cdir = getcwd();
Pentru a schimba catalogul curent de lucru, puteti folosi functia chdir(),
care are urmatoarea forma:
chdir(nume_director)
- Unde "nume_director" este calea sau numele catalogului de lucru
dorit.
Functia returneaza TRUE daca operatia reuseste; n caz contrar,
returneaza FALSE.
De exemplu, daca in directorul curent se afla alt director "temp", pentru
a face din "temp" catalogul curent de lucru, folositi functia chdir() dupa
cum urmeaza:
<?php
$ndir = chdir("temp/");
?>
2. Manipularea cailor de acces
PHP include numeroase functii utile pentru manipularea cailor de acces.
Functia dirname() preia calea de acces la un fisier si returneaza toata
calea, mai putin componenta finala a caii specificate, n cazul n care
componenta finala este un fisier, functia va ajuta sa izolati numele
fisierului de restul caii.
De exemplu, daca se da calea "plomar/curs-php/lectii/[Link]",
functia va returna "plomar/curs-php/lectii".
Functia are urmatoarea forma:
dirname(cale_fisier)
Functia basename() executa operatia complementara, returnnd numai
componenta finala a caii specificate.
De exemplu, daca este data calea "plomar/curs-php/lectii/[Link]",
functia "basename()" va returna "[Link]".
Functia are urmatoarea forma:
basename(cale_fisier)
Daca doriti sa executati mai multe operatii cu o cale,
functia pathinfo() va poate fi de folos. Aceasta functie returneaza un
tablou care include patru elemente (al patrule incepand de la versiunea
PHP 5.2.0):
1. dirname - rezultatul invocarii functiei dirname() avnd ca argument calea
respectiva
2. basename - rezultatul invocarii functiei basename() avnd ca argument
calea respectiva
3. extension - extensia fisierului (daca exista) dat de rezultatului
functiei basename()
4. filename - numele fisierului dat de rezultatului functiei basename(), dar
fara extensie
Iata un exemplu care prezinta modul de utilizare a functiei pathlnfo() :
<?php
$path_parts = pathinfo('plomar/curs-php/lectii/[Link]');
foreach ($path_parts as $num => $val) {
echo "<br /> $num => $val";
}
?>
Datele de iesire ale scriptului de mai sunt urmatoarele :
dirname => plomar/curs-php/lectii
basename => [Link]
extension => php
filename => lectia1
Un alt mod in care puteti utiliza si afla valorile returnate de
functi pathinfo() este urmatorul:
<?php
$path_parts = pathinfo('plomar/curs-php/lectii/[Link]');
echo "<br />". $path_parts['dirname'], "\r\n";
echo "<br />". $path_parts['basename'], "\r\n";
echo "<br />". $path_parts['extension'], "\r\n";
echo "<br />". $path_parts['filename'], "\r\n";
?>
Acest exemplu va returna urmatoarele date de iesire :
plomar/curs-php/lectii
[Link]
php
lectia1
3. Vizualizarea si modifi carea privilegiilor directoarelor
Pentru a vizualiza privilegiile unui director, puteti folosi aceleasi functii
utilizate pentru vizualizarea privilegiilor fisierelor, prezentate in Lectia
17 in tabelul "Functii PHP pentru obtinerea atributelor unui fisier".
folosind ca argument numele sau calea directorului. Aceste functii va
permit sa vizualizati o varietate de caracteristici ale directoarelor,
inclusiv privilegiile de catalog, care sunt returnate de
functia fileperms().
Pentru a modifica privilegiile unui director, folositi functia chmod() care
a fost descrisa in Lectia 17 la sectiunea "Modificarea privilegiilor unui
fisier". Utilizati aceasta functie exact asa cum ati folosi-o pentru a stabili
privilegiile de fisier, folosind ca argument un director.
Pentru a putea atribui sau schimba privilegiile unui director sau fisier, modulul PHP
instalat trebuie sa aiba drepturi de modificare a directoarelor /fisierelor specificate.
4. Citirea continutului unui director
PHP furnizeaza trei functii care va permit sa cititi continutul unui
catalog, ca si cum catalogul ar fi un fisier. Aceste functii sunt:
1. opendir() - deschide directorul pentru citire
2. readdir () - citeste o intrare dintr-un catalog
3. closedir() - nchide catalogul, elibernd resursele alocate de
functia opendir()
Rezultatul apelarii functiei readdir() este un sir care contine numele
urmatorului fisier sau sub-director din catalogul deschis. Functia
returneaza FALSE atunci cnd au fost citite toate intrarile din catalog.
Iata un exemplu care prezinta modul de utilizare a acestor functii pentru
citirea continutului unui catalog:
<?php
$dc = @opendir("home/plomar/curs-php");
if (!$dc) {
echo "Directorul nu a putut fi deschis";
}
else {
while ($ok = readdir($dc)) {
echo "<br /> $ok";
}
closedir($dc);
}
?>
Datele de iesire ale exemplului pot fi similare cu cele prezentate mai jos :
style
imgs
lectia
scripts
[Link]
- Sau puteti folosi functia scandir($dir). Aceasta preia intr-un Array
numele tuturor directoarelor si fisierelor din directorul "$dir". In caz de
nereusita returneaza False.
5. Crearea unui director
Pentru a crea un director, utilizati functia mkdir(), care are urmatoarea
forma:
mkdir(nume_dir, mod)
- Unde "nume_dir" este calea sau numele directorului care va fi creat, iar
"mod" reprezinta privilegiile care trebuie acordate noului catalog.
In mod normal, prima cifra a argumentului mod trebuie sa fie 0, astfel
nct PHP sa-l perceapa ca pe o valoare scrisa n octal. Revizuiti Lectia
17 , sectiunea "Privilegii de fisier"
Functia returneaza TRUE daca creeaza catalogul; n caz contrar,
returneaza FALSE.
De exemplu, pentru a crea un catalog denumit "lucru" si pentru a-i
atribui privilegiile "rwxr-x--x", utilizati functia mkdir() dupa cum
urmeaza:
<?php
$cd = mkdir("lucru", 0751);
if ($cd)
echo "Directorul a fost creat";
else
echo "Directorul nu a putut fi creat";
?>
Pentru a modifica numele unui director, puteti folosi functia rename(),
care are urmatoarea forma:
rename(nume_vechi, nume_nou)
Unde "nume_vechi" este numele si calea originala a directorului, iar
"nume_nou" este numele nou dorit.
- O lista cu mai multe functii utile in lucrul cu directoare gasiti la pagina
-> Functii pentru fisiere si directoare.
Utilizarea de sesiuni PHP
Invatati sa creati sesiuni in PHP
Invatati sa lucrati cu variabile din sesiuni si sa stergeti datele sesiunii
1. Despre sesiuni, crearea unei sesiuni PHP
Sesiunea reprezinta o modalitate prin care PHP retine informatii de la o
pagina la alta.
Odata cu initializarea unei sesiuni, utilizatorul poate pastra anumite
variabile chiar daca in continuare viziteaza si alte pagini ale site-ului. In
principiu informatia se pastreaza pana la inchiderea browser-ului, sau
pana cand utilizatorul distruge in mod intentionat sesiunea curenta.
Lucrurile se desfasoara ca in felul urmator: in momentul cand un user s-a
logat la site, PHP atribuie acestuia un identificator unic de sesiune : SID.
Acest SID este inglobat intr-un coockie cu numele PHPSESSID si trimis
apoi catre browserul utilizatorului. Daca browserul nu suporta cookie-uri
sau acestea sunt dezactivate, atunci acest SID este adaugat la adresa
URL. In acelasi timp se creeaza pe server un fisier cu numele SID. In
continuare daca utilizatorul doreste sa stocheze anumite informatii,
acestea vor fi practic scrise in acest fisier SID de pe server.
Sesiunile au urmatoarele avantaje:
- Pot fi folosite chiar daca browserul utilizatorului nu suporta cookie-uri sau
daca acestea sunt dezactivate.
- Permit stocarea unui volum mare de informatii, spre deosebire de cookie-uri
care sunt limitate in aceasta privinta.
- Sunt mai sigure in raport cu cookie-urile deoarece informatiile nu sunt
transmise in mod repetat intre client si server.
Initializarea unei sesiuni se face cu functia :
session_start()
Aceasta trebuie sa fie printre primele linii de cod dintr-un script PHP,
deoarece apelul acestei functii trebuie facut inainte de trimiterii catre
browser-ul Web a vreunui cod HTML sau chiar a unui spatiu vid.
Daca folosim stocarea iesirii in buffer, instructiunea session_start() nu
trebuie inserata neaparat la inceputul codului.
Instructiunea session_start() nu este necesare daca in fisierul de
configurare "[Link]", variabila "session.auto_start" are valoarea TRUE.
Pentru a intelege mai bine modul de lucru cu sesiuni si
functia session_start(), folosim un exemplu in care avem o pagina
principala "[Link]" unde cream o variabila cu numele "userName",
atribuindu-i valoarea "MarPlo", pe care o stocam intr-o sesiune PHP,
pagina contine o legatura catre o alta pagina "[Link]", aceasta din urma
va folosi functia session_start() pentru a prelua, prin sesiune, valoarea
variabilei "user_name" din pagina "[Link]", astfel putem folosi valoarea
acestei variabile intr-un script din pagina "[Link]".
Continutul fisierului "[Link]" este urmatorul:
<?php
//Fisierul [Link]
session_start();
if(!isset($_SESSION['userName']))
$_SESSION['userName'] = "MarPlo";
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
Aceasta este pagina "[Link]"
<?php
echo "<br />Variabila de sesiune are valoarea: ". $_SESSION['userName'];
?>
<br />Legatura <a href="[Link]">spre pagina [Link]</a>
</body>
</html>
Continutul fisierului "[Link]" este urmatorul:
<?php
//Fisierul [Link]
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Pagina [Link]</title>
</head>
<body>
Aceasta este pagina [Link]
<?php
echo "<br />Variabila de sesiune are valoarea: ". $_SESSION['userName'];
?>
</body>
</html>
Observati ca atribuirea, respectiv citirea variabilelor se face folosind
variabila super-globala : _SESSION.
Deschizand prima pagina, "[Link]", va fi afisat urmatorul rezultat
Aceasta este pagina "[Link]"
Variabila de sesiune are valoarea: MarPlo
Legatura spre pagina [Link]
Cand apasam click pe link-ul "spre pagina [Link]", se va deschide aceasta
pagina, afisand urmatorul continut:
Aceasta este pagina "[Link]"
Variabila de sesiune are valoarea: MarPlo
- In acest exemplu se observa ca pagina "[Link]" detine informatii despre
variabila de sesiune creata in pagina "[Link]".
2. Manipularea variabilelor sesiunii.
In anumite momente ar putea fi util sa aflam identificatorul sesiunii
curente. Pentru aceasta folosim functia session_id(), ca in exemplul
urmator:
<?php
echo "<br /> Identificatorul sesiunii curente SID este:". session_id();
//Va afisa un rezultat asemanator cu: "Identificatorul sesiunii curente SID
este:2846240682abf24a09f42664fc03bbf3"
?>
Functia session_id() accepta un parametru. Astfel putem seta un anumit
SID pentru sesiunea curenta. In acest caz trebuie sa apelam
functia session_id()inainte de functia : session_start(), ca in exemplul
urmator:
<?php
session_id('123abc');
session_start();
echo "<br /> Identificatorul sesiunii curente SID = ". session_id();
//Va afisa rezultatul: "Identificatorul sesiunii curente SID = 123abc"
?>
Deoarece variabilele de sesiune pot fi citite de alti utilizatori neautorizati,
nu este indicat sa pastram aici informatii esentiale cum sint parolele.
Pentru a creea un minimum de securitate putem codifica aceste
informatii, folosind functtile de codare oferite de PHP:
md5() sau crypt()
- Functia md5(sir_de_caractere) codifica sirul de caractere furnizat ca
parametru si returneaza un sir de 32 charactere hexazecimale. Aceasta
functie foloseste algoritmul de criptare: "RSA Data Security, Inc. MD5
Message-Digest Algorithm".
Iata un exemplu de utilizare al acestei codificari:
<?php
$user = "MarPlo";
$codificat = md5($user);
echo "<br /> user codificat = $codificat";
// Va afisa: "user codificat = 0a460e3d95526f05a0064154ad94a378"
?>
Consideram cazul in care avem o variabila de sesiune "$parola" care
pastreaza o parola si dorim sa codificam si sa transmitem acrasta
variabila astfel incat utilizatorii neautorizati sa nu o poata folosi. Pentru
aceasta folosim functia md5(), pentru a o cripta. Mai mult initializam o
variabila globala cu numele "$secret", careia ii atribuim ca valoare un sir
de caractere oarecare. In continuare, inainte de a introduce parola intr-o
sesiune PHP, concatenam valorile "$secret" si "$parola" si criptam
rezultatul. Astfel, chiar daca cineva reuseste sa decripteze variabila de
sesiune, este putin probabil sa poata separa sirul "$secret" creat de noi.
Este bine sa pastram acest fisier intr-un director pretejat, cum ar fi cu un
nivel mai sus decat directorul pentru pagini de Web.
Iata cum se prezinta exemplul prezentat mai sus. (consideram o variabila
"$passtest" care verifica daca valoarea acesteia este egala cu parola):
<?php
$secret = 'abcgfd43599oopjhfdxcaqq30pmnvcx';
$parola = 'mypass';
$cod = md5($secret. $parola);
session_start();
$_SESSION['parola'] = $cod;
// Consideram variabila "$passtest" pentru a testa daca valoarea acesteia este egala cu
parola
if (md5($secret. $passtest) == $_SESSION['parola'])
echo "Parola acceptata";
else
echo "Parola nu este valida";
?>
Astfel, daca valoarea variabilei "$passtest", care poate fi obtinuta de
exemplu dintr-un formular HTML, este identica cu parola pastrata de noi,
va fi afisat mesajul "Parola acceptata".
3. Stergerea unei sesiuni
Pentru a putea sterge o sesiune este necesar sa incepem scriptul PHP
cu instructiunea: session_start(), ca intotdeauna cand folosim sesiuni.
Pentru a sterge toate variabilele memorate in matricea $_SESSION
folosim:
unset($_SESSION);
Pentru a sterge doar o variabila memorata in sesiune folosim :
unset($_SESSION['nume_variabila']);
Datele sesiunii sunt memorate in server in fisiere temporare. Pentru a
sterge datele sesiunii din server folositi:
session_destroy()
Iata un exemplu care ilustreaza aceasta procedura:
<?php
// Initializeaza datele sesiunii
session_start();
// Sterge tabloul $_SESSION
unset($_SESSION);
// Sterge datele de sesiune din server
session_destroy();
echo "<br /> Sesiunea curenta a fost inchisa";
?>
Optiuni pentru utilizarea caracterelor speciale
Invatati rolul optiunilor "magic_quotes"
Invatati sa convertiti caracterele speciale prin schimbarea semnificatiei
acestora utilizand functii PHP
Invatati sa convertiti caracterele speciale specifice HTML si cele din sirurile
folosite pentru adrese URL
1. Ghilimelele magice
Apar situatii cand dorim sa introducem ghilimele in interiorul unui
textintr-o baza de date, dar SQL nu permite nglobarea unor ghilimele
simple n interiorul valorii unui sir. Probleme similare pot aparea la
introducerea unui text ce contine caractere speciale precum: \ + * ? ^
( $ ), si care sunt trimise la un script PHP.
PHP include functii si facilitati pentru rezolvarea acestor situatii.
Fisierul de initializare PHP ("[Link]") contine optiuni de configurare care
determina modul n care PHP controleaza datele provenite de la o sursa
externa, cum sunt un formular HTML, un fisier text sau o baza de date.
Optiunea magic_quotes_gpc specifica modul n care PHP manipuleaza
operatiile HTTP: GET si POST, precum si operatiile dintre PHP si MySQL
sau cele cu variabile cookie. Daca optiunea este activata (ON), PHP
prefixeaza automat ghilimelele simple, ghilimelele duble, caracterele
backslash si caracterele nule (caracterele a caror valoare ASCII este 0)
care apar ntr-o variabila HTTP, cu un caracter backslash (\).
Optiunea magic_quotes_runtime specifica modul n care PHP
manipuleaza datele de origine externa. Daca aceasta optiune este
activata, PHP ignora automat ghilimelele simple si duble care apar n
datele externe, inclusiv datele din formularele HTML, din fisiere si baze
de date.
Daca este activata optiunea magic_quotes_sybase, aceasta modifica
efectul optiunilor magic_quotes_gpc si magic_quotes_runtime, astfel
nct un caracter de tip ghilimele simple sa fie prefixat cu un alt caracter
de tip ghilimele simple, nu cu un backslas.
Dar, n general, accesul la aceste comenzi din fisierul "[Link]" il are
administratorul de sistem iar utilizatorii obisnuiti nu trebuie sa aiba
posibilitatea de a aduce modificari n fisier. Astfel, pot fi folosite functii
PHP care sa seteze aceste optiuni pe durata scriptului respectiv.
Functiile get_magic_quotes_gpc() si get_magic_quotes_runtime() re
turneaza fiecare valoarea optiunii PHP corespunzatoare setate in fisierul
"[Link]". Mai mult, puteti folosi
functia set_magic_quotes_runtime() pentru a specifica valoarea
optiunii magic_quotes_runtime pentru restul duratei scriptului PHP
curent.
De exemplu, pentru a dezactiva optiunea magic_quotes_runtime,
invocati functia
set_magic_quotes_runtime(0);
Alternativ, pentru a activa aceasta optiune intr-un script, folositi functia
set_magic_quotes_runtime(1);
2. Conversia caracterelor speciale si anularea acesteia
PHP poate converti ghilimelele simple si duble dintr-un sir, folosind
functia addslashes().
Daca PHP nu este configurat astfel nct sa converteasca aceste
caractere din sir n mod automat, atunci trebuie sa executati manual
aceasta modificare. Pur si simplu utilizati functia addslashes(),
transferndu-i ca argument sirul text. Aceasta adauga caracterul
backslash "\" pentru conversia caracterelor de tip ghilimele simple,
ghilimele duble, backslash si caractere nule
Aceasta conversie nu trebuie confundata cu o alta, si anume conversia de tip, care
foloseste caracterul backslash (\).
Conversia mentionata n acest capitol consta din modificarea semnificatiei anumitor
caractere, pentru a preveni o interpretare eronata a acestora de catre programele
specializate, precum MySQL. Din acest motiv, toate conversiile mentionate n acest capitol
fac referire la modificarea semnificatiei unor caractere, nu la conversiile de tip.
De exemplu, pentru a converti continutul sirului "$text" si a plasa
rezultatul n variabila "$modificat", invocati functia dupa cum urmeaza:
$modificat = addslashes($text);
Functia stripslashes() executa operatia complementara de anulare a
conversiei, elimina caracterele backslash inserate.
Pentru a anula conversia sirului "$modificat" si a plasa rezultatul n
variabila "$nemodificat", utilizati functia dupa cum urmeaza:
$nemodificat = stripslashes($modificat)
O alta functi utila pentru conversia caracterelor speciale
este quotemeta(), aceasta va insera un backslash nainte de fiecare
aparitie a urmatoarelor caractere: . \ + * ? [ ^ ] ( $ ). Ca
si addslashes(), functia quotemeta() se foloseste in mod similar,
prelund ca argument sirul text.
3. Conversia textelor HTML
Cnd lucrati cu texte HTML, conversia executata de
functia addslashes() nu este suficienta, deoarece HTML este sensibil si
la alte caractere speciale dect cele convertite de
functia addslashes().
In schimb puteti folosi functia htmlspecialchars().
Aceasta converteste caracterele la care HTML este sensibil. Functie este
utila cand se doreste ca un anumit sir sa nu contina marcaje HTML, ceea
ce poate fi important in modul de operare a unei aplicatii, cum ar fi un
tabel HTML.
Functia are urmatoarea forma:
htmlspecialchars("text" [,stil_ghilimele])
Unde "text" specifica sirul care contine textul ce urmeaza a fi convertit,
iar argumentul optional "stil_ghilimele" specifica modul de conversie a
ghilimelelor simple, respectiv duble. Valorile permise ale optiunii
"stil_ghilimele" sunt:
ENT_COMPAT - precizeaza ca trebuie convertite numai ghilimelele duble
ENT_QUOTES - precizeaza ca trebuie convertite ambele tipuri de ghilimele
ENT_NOQUOTES - precizeaza ca nu trebuie convertit nici un tip de ghilimele
De exemplu, pentru a converti toate caracterele HTML speciale, inclusiv
ambele tipuri de ghilimele, din sirul "$texthtml", utilizati functia dupa cum
urmeaza:
$conversie = htmlspecialchars($texthtml);
Functia htmlspecialchars() executa urmatoarele conversii:
Caracter
Rezultatul conversiei
&
(ampersand)
&
"(ghilimele
duble)
" (numait cnd este specificat opiunea
ENT_COMPAT sau ENT_QUOTES)
'(ghilimele
simple)
' (numai cnd este specificat opiunea
ENT_QUOTES)
< (mai mic
dect)
<
> (mai mare
dect)
>
O functie PHP conexa, htmlentities(), converteste toate caracterele cu echivalente n
entitati HTML. Este acceptat setul de caractere ISO-8859-1
Si o alta functie utila pentru conversia textelor HTML este functia n12br(). Aceasta
insereaza tag-ul <br /> anterior fiecarui caracter de tip linie noua care se gaseste in
argumentul sau.
4. Conversia pentru adresele URL
Cnd doriti sa codificati in PHP date ca parte a unei adrese URL, puteti
folosi functia urlencode().
Aceasta functie nlocuieste fiecare caracter non-alfanumeric (cu exceptia
spatiilor) cu un simbol al procentului (%), urmat de doua cifre
hexazecimale care contin valoarea ASCII a caracterului. Spatiile sunt
codificate sub forma de simboluri ale adunarii (+).
O functie conexa, n speta rawurlencode(), executa o conversie
similara; cu deosebirea ca nlocuieste spatiile cu %20, conform RFC
1738, standardul Internet pentru codificarea adreselor URL.
Functiile urldecode() si rawurldecode() executa operatii
complementare. Aceste functii sunt utile la crearea adreselor URL care
includ perechi 'nume-valoare'.
De exemplu, sa presupunem ca avem un script PHP care trebuie sa
creeze o pagina HTML ce contine o hiperlegatura spre adresa URL a unui
motor de cautare. Termenul de cautare trebuie transmis n forma
codificata URL, pentru ca serverul Web si browserul sa nu se "impiedice"
de caracterele speciale. Pentru a codifica datele pentru o adresa URL,
puteti folosi o metoda ca in exemplul urmator:
echo <a href="[Link]?cuvantcheie='.
urlencode($text). '">;
Ca sa intelegeti mai bine aceste moduri de conversie, puteti studia
amanuntit exemplul urmator:
<?php
// Variabila $a contine textul ca va fi convertit
$a = "abc 123 ' <br /> / < & > ( % ) * , $ . # ^ ! [ \ ] { @ } : ; = ?";
$b = addslashes($a);
$c = stripslashes($b);
$d = quotemeta($a);
$e = htmlentities($a);
$f = urlencode($a);
echo
echo
echo
echo
echo
?>
'<br
'<br
'<br
'<br
'<br
/>
/>
/>
/>
/>
Conversie addslashes() = '. $b;
Anulare conversie addslashes() = '. $c;
Conversie quotemeta($a) = '. $d;
Conversie caractere HTML = '. $e;
Conversie pt. adrese URL = '. $f;
Datele de iesire ale exemplului sunt urmatoarele:
Conversie addslashes() = abc 123 \' / < & > ( % ) * , $ . # ^ ! [ \\ ] { @ } :
;=?
Anulare conversie addslashes() = abc 123 ' / < & > ( % ) * , $ . # ^ ! [ \ ]
{@}:;=?
Conversie quotemeta($a) = abc 123 ' / < & > \( % \) \* , \$ \. # \^ ! \[ \\ \]
{ @ } : ; = \?
Conversie caractere HTML = abc 123 ' <br /> / < & > ( % ) * , $ . # ^ !
[\]{@}:;=?
Conversie pt. adrese URL = abc+123+%27+%3Cbr+%2F%3E+%2F+
%3C+%26+%3E+%28+%25+%29+
%2A+%2C+%24+.+%23+%5E+%21+%5B+%5C+%5D+%7B+%40+
%7D+%3A+%3B+%3D+%3F
Notiuni fundamentale despre bazele de date si SQL
(1)
nvatati modul in care este structurata o baza de date
nvatati modul de proiectare a unei baze de date
nvatati sa creati baze de date MySQL si tabele
nvatati sa stergeti si sa modificati tabele dintr-o baza de date MySQL
Acesta lectie explica bazele de date relationale si modul de utilizare a
acestora.
Spre deosebire de fisiere, bazele de date prezinta multe avantaje,
inclusiv o mai mare protectie a integritatii datelor si asigurarea partajarii
datelor.
In aceasta lectie va fi prezentat SQL, limbajul standard pentru crearea,
accesul si manipularea bazelor de date relationale. Detaliile (cu
precadere sintaxa SQL sunt cele referitoare la MySQL, cel mai popular
limbaj de baze de date folosit cu PHP.
1. Structura unei baze de date relationale
O baza de date relationale stocheaza datele n tabele, iar fiecare tabel
stocheaza in coloane informatii despre un anumit tip de element.
In continuare puteti vedea un tabel caracteristic dintr-o baza de date
relationala care prezinta personalitati istorice ale Americii.
PersoanaID
Nume
AnNastere
001
George Washington
1732
002
John Adams
1735
003
Thomas Jefferson
1743
Primul rnd al tabelului atribuie nume pentru fiecare coloana.
Fiecare rnd al tabelului, altul dect primul rnd, descrie o singura
personalitate. De exemplu, al doilea rnd descrie o personalitati pe nume
George Washington.
Fiecare coloana, descrie un anumit atribut al personalitatii De exemplu, a
doua coloana contine numele personalitatilor, iar a treia coloana contine
anii n care s-au nascut acestia.
Pentru a se putea face referire, mai usor, la un anumit rnd al tabelului,
se obisnuieste ca fiecare tabel sa contina o coloana care identifica n mod
unic fiecare rnd. Aceasta coloana se numeste "cheia primara" a
tabelului. In exemplul prezentat, coloana numita "PersoanaID" serveste
drept cheie primara.
Daca nici o coloana nu contine o valoare unica pentru fiecare rnd, se pot
combina valorile mai multor coloane pentru a crea o "cheie primara
compusa".
O baza de date relationala se numeste astfel datorita capacitatii sale de a
stabili relatii ntre date din mai multe tabele.
Urmatorul exemplu prezinta doua tabele si o relatie ntre acestea.
PersoanaID
Nume
AnNastere
Meserie
PersoanaID
001
George Washington
1732
Arhitect
003
002
John Adams
1735
General
001
003
Thomas Jefferson
1743
Filozof
002
Al doilea tabel contine informatii despre meseriile caracteristice ale
persoanelor prezentate in exemplul anterior. Mai precis, tabelul identifica
persoana cu o anumita meserie. Numele meseriei serveste drept cheie
primara a tabelului, care mai contine, n afara de aceasta, o singura
coloana.
Coloana respectiva stocheaza atributul "PersoanaID" din primul tabel, al
persoanei care cunoaste meseria descrisa de un anumit rnd. De
exemplu, angajatul cu numarul 003 este arhitect.
Retineti ca "PersoanaID" este att cheia primara a tabelului original, dar si
o coloana din noul tabel. Coloana "PersoanaID" a noului tabel se numeste
"cheie externa"; desi nu este cheia primara a noului tabel, este cheia
primara a unui alt tabel.
Aplicatia software care gazduieste o baza de date se numeste "sistem de
gestiune a bazelor de date" (SGBD). Exista multe sisteme de gestiune a
bazelor de date, printre cele mai populare asemenea sisteme se numara:
DB2 , Interbase , MySQL , Oracle , Postgresql , SQL Server , Sybase .
MySQL este cel mai popular sistem de gestiune a bazelor de date destinat
utilizarii cu PHP, n mare masura deoarece este gratuit. Totusi, prin
intermediul PHP este posibil accesul la aproape orice SGBD modern.
Bazele de date relationale nteleg SQL (Structured Query Language), un
limbaj relativ simplu, folosit pentru solicitarea datelor. In ciuda simplitatii
sale, SQL este un limbaj foarte puternic, care poate obtine accesul la date
stocate n mai multe tabele, poate filtra datele dorite si poate sorta,
rezuma si afisa rezultatele.
n general, bazele de date relationale si stocheaza datele ntr-un singur
fisier sau catalog. Aceasta caracteristica de organizare faciliteaza
administrarea datelor, deoarece executarea copiei de siguranta, respectiv
restaurarea unui singur fisier sau catalog se realizeaza mai usor.
Sistemele de gestiune a bazelor de date relationale necesita mai multe
cicluri de procesor pentru a satisface o cerere de date dect cele
necesare pentru accesul la un fisier normal, dar ofera protectie sporita a
datelor, iar pentru accesul la distanta usureaza traficul deoarece
majoritatea operatiilor sunt efectuate de programul SQL, astfel singurele
date transmise in retea ar fi rezultatul cerut.
2. Proiectarea unei baze de date
Cand creati un tabel intr-o baza de date, este important sa tineti cont
de "cheia primara" si sa va bazati pe aceasta. Coloanele dintr-un tabel
trebuie sa se bazeze pe cheia primara n totalitatea sa.
O alta operatie importanta este specificarea unui tip de date pentru
fiecare coloana. Majoritatea bazelor de date relationale accepta
urmatoarele tipuri de date generale:
Caracter
ntreg
Zecimal
Data si ora
Binar
Tabelul urmator rezuma tipurile de date cele mai frecvent utilizate,
acceptate de MySQL si de majoritatea bazelor de date relationale. MySQL
accepta multe alte tipuri de date, dar acestea sunt cele mai folosite.
Principalele tipuri de date din MySQL
Tip de date
Descriere
BLOB
- Date binare arbitrare, cu o lungime maxima de 65535
octeti
CHAR(m)
- Un sir de caractere de lungime fixa, cu un maxim de
m caractere, unde m este mai mic dect 256. Pentru
obtinerea lungimii dorite, se insereaza spatii finale
DATE
- O data n format an-luna-zi; de exemplu 2008-10-15
DECIMAL
DECIMAL(m,d)
- Un numar zecimal, reprezentat sub forma de sir cu
"m" cifre, din care "d" se afla la dreapta punctului
zecimal. Daca "m" si "d" sunt omise, n mod prestabilit
se vor utiliza valorile 10 si 0
DOUBLE
DOUBLE (m, d)
- Un numar cu virgula mobila, cu dubla precizie, avnd
o latime de afisare egala cu "m" si un numar de "d"
cifre dupa virgula.
FLOAT(m,d)
- Un numar cu virgula mobila, cu simpla precizie, avnd
o latime de afisare egala cu "m" si un numar de "d"
cifre dupa virgula
INTEGER
INTEGER
UNSIGNED
- Un ntreg pe 32 de biti. Daca se specifica atributul
UNSIGNED, domeniul de valori este cuprins ntre 0 si
4294967295; n caz contrar, domeniul este cuprins
ntre valorile -2147483648 si 2147483647
NUMERIC
- Similar cu DECIMAL
NUMERIC (m, d)
REAL
REAL(m, d)
- Similar cu DOUBLE
SMALLINT
SMALLINT
UNSIGNED
- Un ntreg pe 16 biti. Daca se specifica atributul
UNSIGNED, domeniul de valori este cuprins ntre 0 si
65535; n caz contrar, domeniul este cuprins ntre
valorile 32768 si 32767
TIME
TIMESTAMP
TIMESTAMP(m)
- Ora n format ora-minut-secunda; de exemplu, 08-2000. O valoare de tip data si ora, n format an-luna-zi
ora-minut-secunda; de exemplu, 1976-01-05 [Link].
Aceasta reprezentare este similara celei returnate de
functiile UNIX. Pt. stocare valoarea este transformata
din timpul curent in UTC si transformata invers la
solicitarea datei.
VARCHAR(m)
- Un sir caracter de lungime variabila, cu un maximum
de "m" caractere, unde m este mai mic dect 256
pentru versiuni MySQL anterioare 5.0.3, iar pt. cele mai
noi limita este 65 535 bytes. Spatiile finale au fost
eliminate
Iata cateva indicatii pentru selectarea tipurilor de date:
- Alegeti BLOB ca tip pentru datele pe care nu trebuie sa le manipulati si la
care nu veti obtine acces prin intermediul limbajului SQL.
- Alegeti un tip data sau ora adecvat pentru coloanele care contin date
calendaristice sau ore.
- Alegeti un tip numeric pentru coloanele folosite pentru numere sau n
calcule.
o - Pentru cantitati foarte mari sau foarte mici, alegeti DOUBLE ca
tip de date.
o - Pentru coloane care contin numere fara parte zecimala de
dimensiuni medii, alegeti SMALLINT sau INTEGER ca tip de date.
o - Pentru alte coloane care contin date numerice, alegeti
DECIMAL ca tip de date.
- Alegeti CHAR sau VARCHAR ca tip pentru celelalte coloane, chiar si pentru
cele care contin cifre, cum ar fi un cod postal.
3. Crearea unei baze de date MySQL si a unui tabel
Dupa atata teorie, sa trecem la lucruri mai practice.
La nceput, o baza de date nu contine tabele. Pentru a crea o baza de
date si apoi un tabel ntr-o baza de date, folositi un sub-limbaj SQL
special, cunoscut sub numele de Data Definition Language (DDL).
Puteti emite comenzi DDL si alte comenzi SQL prin intermediul unui
interpretor SQL sau prin intermediul PHP. Pentru inceput va fi prezentat
modul de emitere a comenzilor SQL folosind un interpretor SQL. In
lectiile urmatoare va fi prezentat modul de emitere a comenzilor SQL
utiliznd PHP.
Dupa ce aveti instalat MySQL, deschideti iterpretorul "MySQL Command
Line Client" (asemanator cu, "Command Promt") in care scrieti comenzile
SQL (n general, SQL nu este sensibil la diferenta ntre majuscule si
minuscule. Deci, puteti scrie comensile cum preferati, cu majuscule sau
minuscule).
Ca regula, dupa scrierea comenzilor, la sfarsit trebue sa fie caracterul
"punct si virgula" (;)
Pentru a crea o baza de date, folositi urmatoarea comanda:
CREATE DATABASE nume_db;
Unde "nume_db" este numele bazei de date care va fi creata.
Inainte de a crea un tabel sau a lucra cu alte comenzi intr-o baza de date,
trebuie sa intrati in baza de date existenta, acest lucru se face folosind
comanda:
USE nume_db;
Unde "nume_db" este numele bazei de date. Cu aceeasi comanda "USE
nume_db" se schimba si baza de date in care vrem sa lucram.
Pentru a crea un tabel ntr-o baza de date, emiteti comanda "CREATE
TABLE", care are urmatoarea forma:
CREATE TABLE tabel (coloana tip, coloana tip, );
Unde "tabel" este numele tabelului, "coloana" este numele unei coloane,
"tip" este tipul datelor incluse n coloana, se poate specifica un numar
nedefinit de coloane.
De exemplu, comanda urmatoare creeaza un tabel numit "carte", care
contine coloanele "carteid", "titlu" si "pret":
CREATE TABLE carte (carteid CHAR(10), titlu VARCHAR(255), pret decimal(5,2));
- n afara tipului de date, intre paranteze, puteti specifica si alte atribute
optionale ale unei coloane:
NOT NULL - Fiecare rnd trebuie sa contina o valoare a coloanei asociate;
valorile nule nu sunt permise.
DEFAULT valoare - Daca nu este data o valoare a coloanei asociate, se va
presupune valoarea specificata.
AUTO INCREMENT - MySQL va repartiza n mod automat un numar de serie
ca valoare a coloanei asociate.
PRIMARY KEY - Coloana asociata este cheia primara a tabelului care o
contine.
Iata un exemplu ceva mai complicat de creare a unui tabel, care foloseste
unele din aceste atribute optionale:
CREATE TABLE carte (carteid CHAR(10) PRIMARY KEY,
titlu VARCHAR(255) NOT NULL,
pret DECIMAL(5,2) DEFAULT 50.00);
4. Stergerea si modifi carea unui tabel
Stergerea unui tabel sau a unei coloane este un act irevocabil, datele
fiind definitiv sterse.
Pentru a sterge un tabel, scrieti urmatoarea comanda:
DROP TABLE tabel;
Unde "tabel" este numele tabelului care va fi sters.
Dupa crearea unui tabel, l puteti modifica prin emiterea unei comenzi
"ALTER TABLE", care are mai multe forme.
Urmatoarea forma a comenzii va permite sa stergeti o coloana din tabel:
ALTER TABLE tabel DROP coloana;
Unde "tabel" este numele tabelului care va fi modificat, iar "coloana" este
numele coloanei care va fi stearsa.
O alta forma a comenzii va permite sa adaugati o noua coloana n tabel:
ALTER TABLE tabel ADD coloana tip [optiuni];
Unde "tabel" este numele tabelului care va fi modificat, "coloana" este
numele coloanei care va fi adaugata, "tip" este tipul noii coloane, iar
"[optiuni]" constituie toate optiunile dorite, precum PRIMARY KEY.
De exemplu, pentru a adauga coloana "pretnou" la tabelul "carte", scrieti
comanda:
ALTER TABLE carte ADD pretnou DECIMAL(5,2) DEFAULT 50.00;
Pentru a vedea toate bazele de date create in MySQL, folositi urmatoarea
comanda:
SHOW DATABASES;
Pentru a vedea toate tabelele dintr-o baza de date din MySQL, folositi
urmatoarea comanda:
SHOW TABLES;
Pentru a vedea toate coloanele dintr-un tabel, si atributele acestora,
folositi urmatoarea comanda:
SHOW COLUMNS FROM tabel;
Notiuni fundamentale despre bazele de date si SQL
(2)
Invatati sa acordati si sa revocati privilegii de acces intr-o baza de date SQL
Invatati sa accesati datele stocate intr-o baza de date SQL
Invatati sa modificati datele si tabelul dintr-o baza de date
Invatati sa sortati si sa grupati datele de iesire
1. Acordarea si revocarea privilegiilor de acces
Cnd un utilizator ncearca sa obtina acces la o baza de date
relationala, aplicatia care gazdueste baza de date (in cazul nostru
MySQL) verifica daca utilizatorul are permisiunea de a executa operatia.
Administratorul de sistem poate folosi comanda MySQL "GRANT" pentru
a autoriza un utilizator sa obtina accesul la un tabel din baza de date.
Comanda are urmatoarea forma:
GRANT ALL ON tabel TO utilizator IDENTIFIED BY parola;
Unde "tabel" este numele tabelului, "utilizator" este numele contului de
utilizator, iar "parola" este parola pe care o va furniza utilizatorul pentru
a-si proba identitatea.
Alternativ, administratorul de sistem poate autoriza un utilizator sa obtina
acces la orice tabel dintr-o baza de date specificata, folosind urmatoarea
forma a comenzii "GRANT":
GRANT ALL ON baza_de_date.* TO utilizator IDENTIFIED BY parola;
De exemplu, comanda urmatoare autorizeaza pe utilizatorul "Marius" sa
obtina acces la toate tabelele din baza de date numita "testdb", ori de
cte ori utilizatorul furnizeaza parola "mypassword":
GRANT ALL ON testdb.* TO Marius IDENTIFIED BY mypassword;
Comanda "REVOKE" se poate folosi pentru retragerea privilegiilor
acordate anterior, interzicerea accesului.
Comanda are urmatoarele forme:
REVOKE ALL ON tabel FROM utilizator;
REVOKE ALL ON baza_de_date.* FROM utilizator;
De exemplu, pentru a revoca toate privilegiile (din toate bazele de date)
utilizatorului "tip_rau", scrieti comanda:
REVOKE ALL ON *.* FROM tip_rau;
Comanda "GRANT" are si o forma mai complexa pentru a autoriza accesul
numai la anumite coloane specificate. Forma avansata a acestei comenzi
este:
GRANT privilegiu (coloane) ON tabel TO utilizator IDENTIFIED BY
'parola;
sau
GRANT privilegiu (coloane) ON baza_de_date.* TO utilizator
IDENTIFIED BY 'parola;
- Unde "privilegiu" este privilegiul care urmeaza a fi extins, "coloane" sunt
coloanele carora li se aplica privilegiul, iar "tabel", "baza_de_date",
"utilizator" si "parola" au semnificatiile cunoscute.
Sunt permise si forme similare ale comenzii REVOKE:
REVOKE privilegiu (coloane) ON tabel FROM utilizator;
sau
REVOKE privilegiu (coloane) ON baza_de_date.* FROM utilizator;
ntre privilegiile posibile se numara urmatoarele:
INSERT - care permite adaugarea de date in coloana specificata
SELECT - care permite accesul de citire la rndurile care contin coloana
specificata
UPDATE - care permite actualizarea rndurilor care contin coloana
specificata
De exemplu, pentru a permite unui utilizator sa obtina accesul la o
coloana, fara a o modifica, puteti folosi o secventa de comenzi similara cu
urmatoarea:
REVOKE ALL ON carte FROM Marius;
GRANT
SELECT(carteid, titlu, pret),
INSERT(carteid, titlu, pret),
UPDATE(carteid, titlu, pret)
ON carte TO php IDENTIFIED BY 'mypassword';
REVOKE INSERT(pret) ON carte FROM Marius;
REVOKE UPDATE(pret) ON carte FROM Marius;
- Prima comanda revoca toate privilegiile de la nivelul tabelului; n caz
contrar, aceste privilegii le vor elimina pe cele situate la nivel de coloana.
Pentru a vedea privilegiile acordate unui anumit utilizator, folositi
urmatoarea comanda:
SHOW GRANTS FOR nume_utilizator;
Caracteristica privilegiilor furnizata de MySQL este mai sofisticata si
furnizeaza mult mai multe optiuni. Pentru mai multe informatii, consultati
manualul SQL de la adresa [Link]
2. Accesul la datele dintr-o baza de date, interogarile SQL
n afara de Data Definition Language, SQL include Data Manipulation
Language (DML). DML va permite sa formati interogari, care obtin
accesul la datele aflate ntr-o baza de date relationala si raporteaza
aceste date. De asemenea, puteti folosi DML pentru a insera, actualiza si
sterge rndurile dintr-un tabel.
Cea mai elementara forma de interogare este comanda "SELECT" simpla.
Cea mai simpla interogare raporteaza toate coloanele din toate rndurile
unui tabel. Interogarea are urmatoarea forma:
SELECT * FROM tabel;
- Unde "tabel" este numele tabelului la care se va obtine accesul.
Aceasta comanda va afisa un tabel cu fiecare rnd pe o linie separata.
Datele de iesire includ numele coloanelor si linii care separa coloanele.
Daca doriti sa selectati numai anumite coloane sau sa raportati coloanele
ntr-o anumita ordine, puteti folosi urmatoarea forma a comenzii
"SELECT":
SELECT coloana1, coloana2 FROM tabel;
- Unde "tabel" este numele tabelului, iar "coloana1" si "coloana2" sunt
coloanele la care se va obtine accesul si al caror continut va fi afisat.
Puteti specifica mai multe coloane, separate prin virgula.
Daca vreti sa fie selectate numai acele rnduri care satisfac un anumit
criteriu, clauza "WHERE" va permite sa specificati o conditie; rndurile
care nu satisfac conditia nu sunt raportate.
De exemplu, iata o interogare care raporteaza un singur rnd:
SELECT titlu, pret FROM carte WHERE carteid=1;
Forma conditiilor folosite n sub-limbajul DML al limbajului SQL este
similara cu aceea a conditiilor PHP. Puteti folosi oricare din urmatorii
operatori relationali:
=
<>
!=
<
Egalitate
Inegalitate
Inegalitate, diferit de
Mai mic decat
>
Mai mare decat
<=
Mai mic sau egal cu
=>
Mai mare sau egal cu
Puteti compara valoarea unei coloane cu aceea a altei coloane, respectiv
valoarea unei coloane cu o valoare string. Valorile string SQL (sirurile)
trebuie sa fie incluse ntre ghilimele simple, nu ntre ghilimelele duble.
Cnd unei coloane nu i-a fost repartizata nici o valoare, SQL i atribuie valoarea speciala
NULL. De asemenea, programatorii pot atribui n mod explicit valoarea NULL unei
coloane.
Comparatiile obisnuite cu valori NULL, care folosesc operatorii de (in)egalitate, vor returna
un rezultat fals. Totusi, puteti folosi operatorul special "<=>". care compara valorile
tinnd cont de valoarea NULL. Daca folositi acest operator pentru a compara doua valori
NULL, se obtine un rezultat adevarat.
SQL include si numerosi operatori de comparatie non-algebrici:
Operator
Descriere
x BETWEEN y
AND z
Adevarat, daca valoarea lui x este cuprinsa ntre
valorile lui y si z
x LIKE y
Adevarat daca valoarea lui x este echivalenta cu
modelul y
x NOT LIKE y
Adevarat daca valoarea lui x nu este echivalenta
cu modelul y
x IN (y1, y2)
Adevarat daca valoarea lui x este un membru al
listei y1, y2. Lista poate contine unul, doi sau mai
multi membri
Adevarat daca valoarea lui x nu este un membru al
x NOT IN (y1, y2) listei y1, y2. Lista poate contine unul, doi sau mai
multi membri
x IS NULL
Adevarat daca x are valoarea NULL
x IS NOT NULL Adevarat daca x nu are valoarea NULL
Sub-limbajul folosit pentru specificarea modelelor asociate operatorului
"LIKE" este diferit de cel folosit de PHP. Meta-caracterul "%" corespunde
unui numar de zero sau mai multe caractere, iar meta-caracterul "_"
corespunde unui singur caracter.
Modelele, precum sirurile, sunt incluse ntre ghilimele simple.
- De exemplu, modelul '%ar%' corespunde oricarui sir care contine subsirul 'ar', inclusiv siruri precum 'ar', 'arc' si 'un zar'.
Pentru a plasa un caracter "%" sau "_" ntr-un sir test, folositi secventa "\
%" sau "\_"; ca n PHP.
Ca si PHP, sub-limbajul DML din SQL va permite sa formati expresii logice
care combina expresiile relationale. Puteti folosi oricare din urmatorii
operatori logici:
AND , && - SI, adevarat daca ambii operanzi sunt adevarati
OR , || - SAU, adevarat daca un operand este adevarat
NOT , ! - NU, adevarat daca operandul este fals
De exemplu, urmatoarea interogare raporteaza rndurile care au pretul de
carte mai mare dect 11 sau al caror titlu include sub-sirul 'Curs':
SELECT titlu, pret FROM carte
WHERE pret>11 OR titlu LIKE %Curs%;
Pentru a compara o valoare cu o expresie regulata n MySQL, folositi urmatoarea forma:
x REGEXP y, unde "x" este valoarea care va fi testata, iar "y" este o expresie regulata,
delimitata prin ghilimele simple.
3. Modifi carea datelor dintr-o baza de date
Sub-limbajul SQL, Data Manipulation Language, include comenzi care
va permit sa inserati rnduri noi ntr-un tabel, sa actualizati una sau mai
multe coloane ale rndurilor existente, respectiv sa stergeri rnduri
dintr-un tabel.
Pentru a insera un nou rnd ntr-un tabel, folositi comanda "INSERT",
care are urmatoarea forma:
INSERT INTO tabel VALUES (valoare1, valoare2);
- Unde "tabel" este numele tabelului la care se va adauga rndul.
- "valoare1" este valoarea pentru prima coloana din tabel, iar "valoare2"
este valoarea celei de-a doua coloane din tabel. Se pot da mai mult sau
mai putin de doua valori; numarul valorilor date ar trebui sa fie egal cu
acela al coloanelor din tabel.
O coloana poate primi si valoarea "NULL", cu exceptia situatiilor cnd
definitia coloanei nu permite.
O forma mai buna (si recomandata) a comenzii INSERT specifica numele
coloanelor carora le sunt atribuite valorile:
INSERT INTO tabel (coloana1, coloana2) VALUES (valoare1,
valoare2);
Unde coloana denumita "coloana1" primeste valoarea "valoare1", iar
coloana denumita "coloana2" primeste valoarea "valoare2".
Pot fi specificate mai mult sau mai putin de doua coloane si valori.
Numarul coloanelor specificate trebuie sa fie egal cu numarul valorilor
specificate.
Coloanele care nu sunt denumite n comanda "INSERT" si care nu au o
valoare prestabilita (DEFAULT) primesc valoarea NULL, cu exceptia
situatiilor cnd valoarea respectiva nu este permisa (n acest caz,
comanda INSERT esueaza).
Daca doriti sa adaugati mai multe randuri intr-un tabel, intr-o singura
inserare, puteti folosi urmatoarea forma a comenzii INSERT:
INSERT INTO tabel (coloana1, coloana2)
VALUES (valoare1, valoare2),
(valoare3, valoare4),
(valoare5, valoare6);
Pentru a modifica valoarea unui rnd sau mai multor rnduri existente
ntr-un tabel, folositi o comanda "UPDATE", care are urmatoarea forma:
UPDATE tabel SET coloana1=valoare1, coloana2=valoare2
WHERE conditie;
- Unde "tabel" este numele tabelului ale carui rnduri urmeaza sa fie
modificate, "coloana1" este numele primei coloane care urmeaza a fi
modificata, "valoare1" este valoarea care va fi repartizata n "coloana1",
"coloana2" este numele celei de-a doua coloane care urmeaza a fi
modificata, "valoare2" este valoarea care va fi repartizata n "coloana2",
iar "conditie" identifica rndul sau rndurile care urmeaza a fi actualizate,
dupa o anumita conditie.
Poate fi actualizat un numar mai mare sau mai mic de coloane. Daca se
doreste ca toate randurile coloanei sa fie actualizate, clauza "WHERE"
poate fi omisa.
De exemplu, comanda urmatoare modifica din coloana "titlu" numele
asociat cartii in "Curs2", in randul unde coloana "pret" are valoarea 5.
UPDATE carte SET titlu=Curs2
WHERE pret=5;
Pentru a sterge un rnd dintr-un tabel, folositi comanda "DELETE", care
are urmatoarea forma:
DELETE FROM tabel WHERE conditie;
Daca se vrea a fi sterse toate rndurile tabelului, clauza WHERE poate fi
omisa.
De exemplu, comanda urmatoare sterge rndul din tabelul "carte" asociat
titlului "Curs2":
DELETE FROM carte WHERE titlu='Curs2';
4. Sortarea si gruparea
Deseori, este important ca datele sa fie raportate ntr-o anumita
secventa. Puteti specifica ordinea de raportare a rezultatelor interogarii
folosind clauza "ORDER BY", care are urmatoarea forma:
ORDER BY valoare
Daca se vor folosi mai multe cmpuri de sortare, acestea vor fi separate
prin virgula.
Daca doriti sa indicati o sortare descendenta, n locul uneia ascendente,
specificati "DESC" dupa valoare.
De exemplu, pentru a ordona toate cartile n functie de pret, de la cel mai
mare la cel mai mic, respectiv dupa titlu pentru un pret egal, puteti folosi
urmatoarea interogare:
SELECT pret, titlu FROM carte
ORDER BY pret DESC, titlu;
Pentru a include numai titlurile care au un pret mai mare de 50, adaugati
o clauza WHERE la comanda SELECT:
SELECT pret, titlu FROM carte
WHERE pret>50
ORDER BY pret DESC, titlu;
SQL include functii care va permit sa raportati valori diferite, valori utile,
precum un numar al rndurilor tabelului. Iata cele mai importante functii
in acest sens:
Functie
count(*)
Descriere
- Numarul rndurilor din tabel
- Numarul rndurilor din tabel care
count(coloana) contin o valoare diferita de NULL n
coloana specificata
count(distinct
coloana)
- Numarul valorilor distincte diferite de
NULL care apar n coloana specificata
avg(coloana)
- Valoarea mijlocie (medie) a coloanei
numerice specificate
min(coloana)
- Valoarea minima din coloana
specificata
max(coloana)
- Valoarea maxima din coloana
specificata
sum(coloana)
- Suma valorilor din coloana specificata
De exemplu, interogarea urmatoare raporteaza numarul cartilor si pretul
mediu al acestora:
SELECT count(*), avg(pret) FROM carte;
- Datele de iesire vor fi afisate pe o singura linie.
Clauza SQL "AS" specifica un nume nou pentru o coloana sau expresie.
Numele specificat este folosit ca titlu n rapoartele SQL. Clauza "AS" este
utila n lucrul cu functiile din tabelul anterior, va ajuta sa identificati mai
usor datele de iesire.
De exemplu, interogarea precedenta poate fi rescrisa pentru a include o
clauza "AS", astfel:
SELECT count(*) AS Carte_Numar,
avg(pret) AS Pret_Mediu
FROM carte;
O alta clauza utila este "GROUP BY", aceasta are urmatoarea forma:
GROUP BY coloana-sortare
- Unde "coloana-sortare" este numele sau valoarea unei coloane,
specificata ntr-o clauza "ORDER BY", care trebuie sa urmeze dupa clauza
"GROUP BY".
De exemplu, avem un tabel "carte" cu 4 coloane (carteid, titlu, anul si
pret), interogarea urmatoare raporteaza numarul cartilor si pretul mediu
pentru fiecare an (anul) n parte:
SELECT count(*), avg(pret) FROM carte
GROUP BY anul
ORDER BY anul;
Pentru a include n datele de iesire numai grupurile selectate, specificati
clauza "HAVING" imediat dupa clauza "GROUP BY". Clauza "HAVING" are
urmatoarea forma:
HAVING conditie
De exemplu, pentru a include numai cartile al caror atribut "anul" are
valoare mai mare dect 1980, srieti urmatoarea interogare:
SELECT count(*), avg(pret) FROM carte
GROUP BY anul
HAVING anul>1980
ORDER BY anul;
Mai jos sunt afisati operatorii matematici folositi in SQL:
+
Adunare
Scadere
*
Inmultire
/
Impartire
|
SAU, la nivel de bit
&
SI la nivel de bit
>>
Deplasare la dreapta
<<
Deplasare la stanga
_
Complement la nivel de bit
Notiuni fundamentale despre bazele de date si SQL
(3)
Invatati principalele expresii si functii folosite in MySQL
Invatati sa preluati datele, prin "unire", din mai multe tabele
Invatati sa executati instructiuni MySQL scrise intr-un fisier extern
1. Expresii si functii
SQL va permite sa formati expresii folosind valori din coloane, valori
literale si functii. Ca si n PHP, puteti controla ordinea de evaluare a
expresiilor SQL folosind paranteze pentru a delimita sub-expresiile care
trebuie evaluate mai intai.
Tabelele urmatoare rezuma functiile MySQL frecvent folosite
Functii matematice frecvent folosite n MySQL
Functie
abs(x)
Descriere
- Valoarea absoluta a lui x
atan(x) - Arc tangenta lui x, unde x este dat n radiani
- Arc tangenta lui y/x, unde semnele ambelor
atan2(y,x
argumente sunt folosite pentru a determina
)
cadranul cercului trigonometric
ceiling(x) - Cel mai mic ntreg care nu este mai mic dect x
cos(x)
- Cosinusul lui x, unde x este exprimat n radiani
exp(x)
- Baza logaritmilor naturali (e) ridicata la puterea x
floor(x)
- Cel mai mare ntreg care nu este mai mare dect
x
log (x)
- Logaritmul natural al lui x
mod(x,y) - Restul mpartirii x/y
power(x,
- x la puterea y
y)
rand(x) - Valoare aleatoare cu virgula, mai mare sau egala
cu zero si mai mica dect unu
- Valoarea -1, 0 sau 1, dupa cum valoarea lui x este
negativa, zero sau pozitiva
sign(x)
sin(x)
- Sinusul lui x, unde x este dat n radiani
sqrt(x)
- Radacina patrata a lui x
tan(x)
- Tangenta lui x, unde x este dat n radiani
\Functii sir frecvent folosite n MySQL
Functie
Descriere
ascii(s)
- Codul ASCII al octetului celui mai din stnga al
sirului s
char(n)
- Caracter al carui cod ASCII este n
concat(s1, - Concatenarea sirurilor s1 si s2; cu alte cuvinte,
s2)
s2 atasat la s1
lcase(s)
- Sirul s, unde toate majusculele au fost
transformate n minuscule
left(s,n)
- Primii n octeti ai sirului s, de la stnga la dreapta
length(s) - Numarul octetilor din sirul s
locate(s1, - Pozitia primei aparitii a lui s1 n s2, respectiv
s2)
zero daca s1 nu se gaseste n s2
ltrim(s)
- Sirul s, cu eliminarea spatiilor de nceput
right(s,n) - Primii n octeti din sirul s, de la dreapta la stnga
rpad(s1,n,s - Sirul s1, completat la dreapta cu sirul s2 pna
2)
cnd rezultatul are lungimea n
rtrim(s)
- Sirul s, cu spatiile finale eliminate
space(n)
- Un sir alcatuit din n spatii
substring(s, - Sub-sir al lui s, care ncepe de la pozitia m si
m,n)
care are lungimea n
trim(s)
- Sub-sir al lui s, cu spatiile initiale si finale
eliminate
ucase(s)
- Sirul s, cu toate minusculele convertite n
majuscule
Functii MySQL de data si ora frecvent utilizate
Functie
Descriere
dayofmont
- Ziua din luna a datei specificate (1-31)
h(d)
dayofweek - Ziua din saptamna a datei specificate (1
(d)
=duminica, 2=luni,, 7=smbata)
dayofyear(
- Ziua din an a datei specificate (1-366)
d)
hour(t)
minute(t)
- Partea orelor din momentul de timp mentionat
(0-23)
- Partea minutelor din momentul de timp
mentionat (0-59)
month(d) - Luna datei specificate (1-12)
now()
second(t)
week(d)
- Data si ora curenta
- Partea secundelor din momentul de timp
mentionat (0-59)
- Saptamna din an a datei specificate (0-53)
year(d)
- Partea anilor din momentul de timp mentionat
(1000-9999)
Functii specifice MySQL
Functie
Descriere
database() - Returneaza numele bazei de date deschise
get_lock(s,
- Obtine o blocare a bazei de date
n)
md5(s)
- Returneaza o suma de control a sirului s,
calculata dupa algoritmul MD5
password( - Returneaza sirul s, criptat folosind algoritmul
s)
aplicat de MySQL parolei
release_loc
- Anuleaza blocarea unei baze de date
k(s)
user()
- Returneaza numele utilizatorului curent
version() - Returneaza numarul versiunii MySQL
2. Uniri
SQL va permite sa obtineti accesul la mai multe tabele ntr-o singura
interogare, n general, aceasta operatie se executa pentru ca datele
dintr-un tabel sa poata fi folosite cu date din alt tabel.
De exemplu, sa presupunem ca baza de date este asemanatoare celei
prezentate mai jos, unde avem doua tabele, primul numit "persoane" iar
cel de-al oilea numit "meserii", si o relatie cheie externa - cheie primara
(persoanaid) asociaza cele doua tabelele.
persoanaid
001
nume
George Washington
AnNastere
meserie
persoanaid
1732
Arhitect
003
002
John Adams
1735
General
001
003
Thomas Jefferson
1743
Filozof
002
Sa examinam urmatoarea interogare:
SELECT nume, meserie FROM persoane, meserii
WHERE [Link]=[Link];
- Constructiile "[Link]" si "[Link]" se numesc
"nume definite", prima se refera la coloana "persoanaid" din tabelul
"persoane", iar a doua se refera la coloana "persoanaid" a tabelului
"meserii".
- Clauza WHERE asigura o echivalenta ntre valoarea cheii externe din
tabelul "meserii" cu aceea a cheii primare din tabelul "persoane", (n
absenta clauzei WHERE, se va stabili o corespondenta ntre fiecare rnd
din tabelul cu meserii si fiecare rnd din tabelul cu persoane; un
asemenea rezultat, numit "produs cartezian", contine n general multe
rnduri - majoritatea nedorite - si ca atare trebuie evitat).
- Rezultatul interogarii de mai sus este un raport care indica numele si
meseria asociata fiecarui angajat prezentat n tabelul "meserii".
O interogare ca aceasta, care combina date din mai multe tabele, se
numeste "unire". Sunt posibile si uniri mai complexe, care implica trei sau
mai multe tabele.
Daca un rnd dat din tabelul principal (aici "persoane") nu are nici un
rnd asociat n tabelul cu detalii (aici "meserii"), rndul respectiv din
tabelul principal nu va aparea n datele de iesire ale unei uniri. In cazul
acesta, pentru a determina aparitia acestei nregistrari din tabelul
principal, se poate folosi o categorie speciala de unire, cunoscuta sub
numele de "unire la stnga" sau "unire exterioara la stnga". Iata un
exemplu:
SELECT nume, meserie FROM persoane
LEFT JOIN meserii
ON [Link]=[Link];
Aceasta interogare va afisa toate persoanele, indiferent daca acestea au
sau nu asociata o meserie. Persoanele fara o meserie au specificatia NULL
n coloana corespunzatoare meseriei.
3. Executarea instructiunilor dintr-un fi sier extern
Comenzile MySQL pot fi scrise si intr-un fisier extern (editat de
exemplu, in Windows, cu Notepad), acest fisier se numeste "script de
shell".
Scriptul din fisierul extern poate fi executat din fereastra de comanda
MySQL (MySQL Command Line Client), utilizand comanda:
SOURCE nume_fisier
Unde "nume_fisier" este calea si numele fisierului in care se afla scriptul
de shell.
De exemplu, scriem urmatoarele comenzi intr-un fisier numit "[Link]"
pe care-l salvam in directorul "C:/teste".
CREATE DATABASE lucrudb;
USE lucrudb;
GRANT ALL ON lucrudb.* TO php IDENTIFIED BY 'mypass';
CREATE TABLE angajat (
angajatnr SMALLINT PRIMARY KEY,
nume VARCHAR(50),
ore SMALLINT,
departament CHAR(16),
salariu DECIMAL(8,2),
data_angajare DATE);
INSERT INTO angajat (
angajatnr,
nume,
ore,
departament,
salariu,
data_angajare)
VALUES (
1,
'George Washinton',
40,
'Contabilitate',
500.00,
'2007-10-04'),
( 2,
'John Adams',
35,
'Marketing',
1000.00,
'2007-10-11'),
( 3,
'Thomas Jefferson washinton',
20,
'Vanzari',
1300.00,
'2007-07-02');
- Pentru a executa acest script, scriem in fereastra de comanda
MySQL: SOURCE C:/teste/[Link]
MySQL va executa comenzile din script ca si cum acestea ar fi scrise
direct in linia de comanda.
Exemplul de mai sus va crea o baza de date noua, numita "lucrudb", va
acorda utilizatorului "php" toate drepturile in utilizarea acestei baze de
date, dupa care va crea tabelul "angajat", cu 6 coloane ("angajatnr",
"nume", "ore", "departament", "salariu", "data_angajare") in care vor fi
adaugate trei linii.
PHP MySQL - Introducere si Tipuri de Date
MySQL este cea mai populara aplicatie open-source de baze de date
folosita cu PHP.
O baza de date de obicei contine una sau mai multe tabele, folosita
pentru a stoca informatii pe categori.
Tabelele contin coloane si inregistrari (randuri) cu date.
Mai jos este un exemplu de tabel folosit pentru a stoca informatiile
utilizatorului (nume, email, parola):
id name password
email
1 Marius
faith
name@[Link]
2 MarPlo
peace
user@[Link]
3 I_AM
love
address@[Link]
- Aceasta tabela contine trei inregistrari /randuri (unu pentru fiecare
persoana/utilizator) si patru coloane (id, name, password, email)
Reguli de sintaxa MySQL
Fiecare baza de date si fiecare tabela este indentificata printr-un nume.
Regulile de baza MySQL pentru nume de baze de date, tabele, si coloane
sunt:
Numele poate avea maxim 64 de caractere.
Poate contine numai litere, numere, si sublinia (indicat fara spatii).
Numele poate incepe cu un numar, dar nu poate contine numai numere.
O tabela nu poate avea doua coloane cu acelasi nume si o baza de date nu
poate avea doua tabele cu acelasi nume.
Numele tabelelor si coloanelor sunt case-sensitive ("Php" e diferit de "php").
Tipuri de date MySQL
Cand se creaza un tabel in MySQL, trebuie definit tipul de date pe care
fiecare coloana il va contine. Exista trei tipuri principale: Text
(strings), Numere,Data si Ora; si doua tipuri secundare: Liste
predefinite si Date binare.
Tipul de date dicteaza ce informatie poate fi stocata si cum, acesta
influenteaza si performanta generala a bazei de date.
Tabelul de mai jos listeaza tipurile de date folosite pentru MySQL, cu o
scurta descriere si cat spatiu ocupa.
Tip
Stocare text
CHAR(lungime)
Marim
e
Descriere
Diferenta dintre "Tipurile de date pentru text" consta
in numarul maxim de caractere ce poate fi stocat intrun camp individual, modul de tratare a spatiilor, si
daca se poate seta o valoare initiala.
lungim Un camp cu lungime fixa de la 0 la 255 de
e bytes caractere. Accepta o valoare initiala.
VARCHAR(lungime lungim Camp cu lungime variabila de la 0 la 65,535
)
e+1
Tip
Marim
e
or 2
bytes
Descriere
caractere. Accepta o valoare initiala.
TINYTEXT
lungim
e+1
Un sir cu lungime maxima de 255 characters
bytes
TEXT
lungim
Un sir cu o lungime maxima de 65,535
e+2
caractere. Nu poate defini o valoare initiala.
bytes
MEDIUMTEXT
lungim
Un sir cu o lungime maxima de 16,777,215
e+3
caractere
bytes
LONGTEXT
lungim
Un sir cu o lungime maxima de 4,294,967,295
e+4
caractere
bytes
Stocare numere
Aceste tipuri de date reprezinta numere in diferite
forme.
TINYINT(lungime) 1 byte
Interval de la 128 la 127. Sau de la 0 la 255
unsigned
SMALLINT(lungim
Interval de la 32,768 la 32,767. Sau de la 0
2 bytes
e)
la 65,535 unsigned
MEDIUMINT(lungi
Interval de la 8,388,608 la 8,388,607. Sau de
3 bytes
me)
la 0 la 16,777,215 unsigned
INT(lungime)
Interval de la 2,147,483,648 la
2,147,483,647. Daca coloana este declarata
4 bytes
UNSIGNED, intervalul este de la 0 la
4,294,967,295
BIGINT(lungime)
8 bytes Interval de la 9,223,372,036,854,775,808 la
Tip
Marim
e
Descriere
9,223,372,036,854,775,807. Sau de la 0 la
18,446,744,073,709,551,615 unsigned
FLOAT(lungime,
decimals)
Numar mic cu virgula (cu zecimale). Deoarece
PHP va formata numerele in functie de
4 bytes
calcule, se recomanda sa folosesti FLOAT fara
parametri optionali.
DOUBLE(lungime,
8 bytes Numar mare cu zecimale
decimals)
lungim
DECIMAL(lungime e + 1
, decimals)
or 2
bytes
Un tip DOUBLE care permite un numar fix de
zecimale. Inainte de MySQL 5.0.3, tipul de
date DECIMAL a fost stocat ca un sir, ca sa nu
poata fi folosit cu functii SQL, cum ar fi SUM()
Stocare data si MySQL stocheaza data intr-un singur format: YYYYtimp
MM-DD
DATE
3 bytes
O data stocata ca YYYY-MM-DD. Intervalul
este de la 1000-01-01 la 9999-12-31
DATETIME
8 bytes
Data si ora, afisat in format YYYY-MM-DD
HH:MM:SS
TIMESTAMP
Un timestamp (de obicei generat automat de
calculator). Poate contine valori ce reprezinta
4 bytes date de la inceputul lui 1970 pana in Januarie
2038. Coloanele TIMESTAMP sunt afisate in
acelasi format ca si coloana DATETIME.
TIME
3 bytes Ora in format HH:MM:SS
Stocare liste
predefite
MySQL te lasa sa stochezi doua tipuri de liste
predefinite (pot fi vazute ca echivalente pentru radio
butonul si caseta de verificare).
Tip
Marim
e
Descriere
Acest tip de coloana stocheaza o singura
alegere din lista predefinita, fiecare coloana
poate avea una din mai multe valori posibile
ENUM
1 or 2
bytes
SET
Aceast tip de coloana stocheaza zero sau mai
multe inregistrari din lista predefinita. Ca si
1, 2, 3, ENUM, cu exceptia ca fiecare coloana poate
4, or 8 avea mai mult de o valoare din mai multe
bytes
valori posibile, sau mai multe inregistrari
dintr-o lista predefinita. Lista poate contine
cel mult 64 de inregistrari.
Storing binary
Stocheaza date binare, ca imaginile.
data
TINYBLOB
Pana la 255 bytes
BLOB
Pana la 64kB
MEDIUMBLOB
Pana la 16MB
LONGBLOB
Pana la 4GB
- Parametri (lungime, decimal) sunt optionali, dar pentru motive de
performanta, ar trebui specificati pentru a restrictiona cata informatie sa
fie stocata in oricare din coloane. Bazele de date sunt de obicei mai
rapide cand lucreaza cu coloane care au marimea fixata.
- Foloseste VARCHAR pentru elemente de text scurte si TEXT pentru cele
mai lungi.
- Foloseste DECIMAL pentru a stoca valori pt. bani.
- Pentru data si ora, este indicat sa folositi TIMESTAMP daca doriti sa
inregistrati in acel camp un punct fix in timp (de exemplu data cand o
inregistrare a fost introdusa in baza de date). Folositi DATETIME daca
data/ora pot fi setate si schimbate arbitrar.
La tipul TIMESTAMP data si ora este setata automat cu timpul curent cand
se face INSERT sau UPDATE, daca nu se specifica o valoare pentru acel
camp.
- Nu este o buna idee sa folosesti date binare. Solicita prea mult baza de
date, si nu se pot afisa imagini direct din baza de date.
Aceasta lectie e doar pentru o scurta introducere, si puteti reveni ca sa
verificati tipul de date care doriti sa fie folosit.
In tutorialul urmator puteti invata cum sa va conectati la serverul MySQL
cu PHP, sa creati o baza de date si tabele, utilizand interfata MySQLi
(MySQL Improved).
PHP MySQL - utilizare MySQLi
PHP are trei moduri diferite prin care se poate conecta si interactiona
cu baza de date MySQL : extensia MySQL originala (cu functii), MySQL
Improved (MySQLi, obiect-orientat), sau PHP Data Objects (PDO, obiectorientat).
Ele nu pot fi amestecate in acelasi script. Extensia originala MySQL nu
mai este activ dezvoltata si nu este recomandat pentru proiecte PHPMySQL noi.
Documentatia PHP descrie MySQLi ca fiind optiunea preferata
recomandata de MySQL pentru proiecte noi.
Conectare la MySQL
Inainte de a putea accesa informatii din baza de date , trebuie creata o
conexiune cu serverul MySQL.
Pentru a va conecta la un server MySQL cu PHP si MySQLi, se creaza
o instanta de obiect mysqli, cu formula new mysqli(), la care se
adauga datele de conectare.
- Sintaxa:
$conn = new mysqli($servername, $username, $password, $database, $port);
- $servername - Specifica serverul la care sa se conecteze. Daca adaugati
valoarea NULL sau un sir gol "", serverul va folosi valoarea standard:
"localhost".
- $username - Specifica numele de utilizator la baza de date MySQL.
- $password - Specifica parola utilizatorului pentru conectare.
- $database - Optional. Numele bazei de date care contine tabelele.
- $port - Optional. Specifica port-ul prin care se face conectarea la
serverul MySQL, standard este 3306
- Exemplu:
<?php
// conectare la server
$conn = new mysqli('localhost', 'root', 'pass', 'dbname');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
?>
- Aceast cod face conectarea la baza de date numita "dbname", si
stocheaza conexiunea in instanta de obiect $conn.
Daca exista erori la conexiune, mysqli_connect_errno() returneaza codul
de eroare.
Inchiderea unei conexiuni
Conexiunea va fi inchisa automat cand scriptul se termina. Se recomanda
totusi sa inchideti conexiunea mai devreme, cand scriptul nu o mai
foloseste. Acest lucru va elibera memoria folosita de conexiune. Pentru a
inchide o conexiune se foloseste metoda close() din clasa MySQLi.
- Exemplu:
<?php
// conectare la server
$conn = new mysqli('localhost', 'root', 'pass', 'dbname');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// ceva cod
$conn->close();
// termina conectarea
// alt cod PHP
?>
Creare baza de date cu MySQLi
Pentru a stoca informatii in MySQL, este nevoie de o baza de date.
Comanda CREATE DATABASE este folosita pentru a crea o baza de date
in MySQL.
- Sintaxa:
CREATE DATABASE database_name
Pentru a face un script PHP sa execute instructiunile SQL, mai intai trebuie
sa creati o instanta de obiect mysqli, care va contine conexiunea la
server, apoi folositi metoda query() din clasa MySQLi.
- Sintaxa:
mysqliObj->query($sql_query)
- mysqliObj - este instanta de obiect mysqli, creata cu new mysqli()
- $sql_query - este un sir cu instructiuni SQL.
Aceasta metoda trimite interogarea sau comanda la serverul MySQL, va
returna obiectul rezultat, sau TRUE la succes, FALSE in caz de eroare.
Exemplul urmator creaza o baza de date numita "tests":
<?php
// conectare la serverul MySQL
$conn = new mysqli('localhost', 'root', 'pass');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Conectare nereusita: '. mysqli_connect_error());
}
// interogare sql cu CREATE DATABASE
$sql = "CREATE DATABASE `tests` DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci";
// executa interogarea $sql pe server pentru a crea baza de date
if ($conn->query($sql) === TRUE) {
echo 'Baza de date "tests" a fost creata';
}
else {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
- Cand doriti sa creati o noua baza de date, se adauga doar primele trei
argumente la obiectul mysqli (servername, username si password). Dar
daca vreti sa folosesti un port specific, adaugati un sir gol "" pentru
argumentul ce reprezinta numele bazei de date :
Exemplu: new mysqli('localhost', 'root', 'pass', '', port)
- Instructiunea suplimentara: DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci seteaza baza de date sa foloseasca UTF-8 charset pentru
codarea caracterelor.
Exemplul de mai sus creaza o baza de date numita "test", afisaza "Baza
de date "tests" a fost creata", sau un mesaj de eroare in caz de esec.
$conn->error (sau poate fi folosit mysqli_error($conn) ) returneaza un sir
cu o descriere a ultimei erori(daca exista).
Comenzile SQL sunt case-insensitive, astfel puteti folosi "CREATE DATABASE" sau
"create database". Dar numele tabelelor si coloanelor sunt case-sensitive.
Creare tabel in MySQL
Dupa ce ati realizat o conexiune la o baza de date, puteti crea tabele in
ea. Tabelele sunt elementele care stocheaza datele in baza de date.
Pentru a crea un tabel in MySQL, se foloseste comanda CREATE TABLE,
apoi se apeleaza metoda query().
- Sintaxa:
CREATE TABLE `table_name`
(
`nume_coloana1` tip_date,
`nume_coloana2` tip_date,
`nume_coloana3` tip_date,
....
)
- tip_date specifica tipul de date pe care o coloana le poate contine.
Pentru o lista cu tipurile de date MySQL, vedeti lectia precedenta: PHP
MySQL - Introducere si Tipuri de date.
Dupa "tip_date", se pot specifica si alte atribute optionale pentru fiecare
coloana:
NOT NULL - Fiecare rand trebuie sa contina o valoare in acea coloana,
valorile null nu sunt permise.
DEFAULT value - Seteaza o valoare initiala care este adaugata cand nici o
alta valoare nu este transferata
UNSIGNED - Poate fi folosit pentru numere, seteaza sa fie folosite doar
numere pozitive si zero.
AUTO INCREMENT - MySQL va mari automat valoarea din randul urmator cu
1 de fiecare data cand o noua inregistrare este adaugata.
PRIMARY KEY - Este folosit pentru a identifica unic randurile dintr-un tabel.
Coloana cu setarea PRIMARY KEY este de obicei un ID numeric, si in general
folosita cu AUTO_INCREMENT
Fiecare tabel ar trebui sa aiba o coloana primary key. Valoarea ei trebuie
sa fie unica pentru fiecare inregistrare din tabel.
- Exemplu:
<?php
// conectare la serverul MySQL
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql pentru CREATE TABLE
$sql = "CREATE TABLE `users` (
`id` INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(25) NOT NULL,
`pass` VARCHAR(18) NOT NULL,
`email` VARCHAR(45),
`reg_date` TIMESTAMP
) CHARACTER SET utf8 COLLATE utf8_general_ci";
// Executa interogarea $sql query pe server pentru a crea tabelul
if ($conn->query($sql) === TRUE) {
echo 'Table "users" successfully created';
}
else {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
- Acest cod va crea un tabel numic "users" in baza de date "tests", cu
cinci coloane (id , name , pass , email si reg_date), seteaza coloana 'id' ca
campul primary key.
In imaginea de mai jos puteti vedea descrierea tabelului "users".
In comenzile SQL este recomandat ca numele de tabel si coloane sa fie adaugat intre
apostrof ` ` (caracterul de langa butonul cu numerul 1 pe tastatura). Aceasta este sintaxa
corecta dar nu este strict necesara.
PHP MySQL - INSERT INTO
Dupa ce o baza de date si tabelele ei au fost create, puteti sa adaugati
informatii in ele.
Cateva reguli de sintaxa:
In PHP, interogarea SQL trebuie sa fie scrisa intre ghilimele.
Valorile de tip String (sir), din interogarea SQL, trebuie sa fie intotdeauna
intre ghilimele.
Valorile numerice si NULL nu trebuie adaugate intre ghilimele.
Introducere date in tabel MySQL
Pentru a adauga inregistrari noi intr-un tabel MySQL, se foloseste
comanda INSERT INTO.
Exista doua metode prin care o interogare INSERT poate fi scrisa:
1) Prima metoda nu specifica numele coloanelor unde datele for fi
introduse, ci doar valorile lor.
- Sintaxa:
INSERT INTO nume_tabel
VALUES (valoare1, valoare2, valoare3, ...)
In aceasta metoda, trebuie sa specificati o valoare pentru fiecare coloana,
chiar daca este NULL. Daca sunt cinci coloane in tabel, trebuie sa
adaugati cinci valori, separate prin virgula.
2) Pentru a doua metoda se specifica atat numele coloanei /coloanelor cat
si valorile care vor fi intoduse:
- Sintaxa:
INSERT INTO nume_tabel (coloana1, coloana2, coloana3,...)
VALUES (valoare1, valoare2, valoare3,...)
Aceasta este in general metoda preferata, deoarece puteti adauga doar
coloanele care vor primi valori. Orice coloana caruia nu ii este atribuita o
valoare va fi tratata ca NULL (sau ii va fi data valoarea default, daca
aceasta este definita).
Daca o coloana nu poate avea valoarea NULL (a fost definita ca NOT
NULL) si nu are o valoare default, nespecificand o valoare va genera
eroare.
Daca o coloana este AUTO_INCREMENT sau TIMESTAMP, nu este nevoie sa
fie specificata in interogarea SQL, serverul MySQL va seta si adauga
valoarea automat.
Pentru ca PHP sa execute comenzile SQL, trebuie sa folosesti metoda
mysqli query() .
- Urmatorul exemplu adauga o noua inregistrare in tabelul "users" . Acest
exemplu foloseste tabelul "users" creat in lectia anterioara, cu cinci
coloane (id , name , pass , email si reg_date).
Campul "id" este AUTO_INCREMENT, deci nu trebuie specificat in
interogarea SQL, serverul MySQL va adauga automat valoare pentru el. La
fel si pentru "reg_date", care este setat TIMESTAMP.
<?php
// conectare la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql pentru users INSERT INTO
$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
VALUES ('Marius', 'faith', 'name@[Link]')";
// Trimite interogarea $sql la MySQL pentru a introduce valorile
if ($conn->query($sql) === TRUE) {
echo 'Datele au fost adaugate';
}
else {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
- Mai intai se creaza instanta de obiect mysql cu identificatorul de
variabila $conn. Apoi, se defineste sirul cu instructiunea SQL, salvat intr-o
variabila numita $sql. Apoi se apeleaza metoda query() , si in acelasi timp
se verifica valoarea returnata pentru a determina daca datele au fost
adaugate.
Exemplul de mai sus adauga un rand in tabelul "users", cu valoarea
"Marius" in coloana "name", valoarea "faith" in campul "pass", si
"name@[Link]" pentru "email". Valorile pentru celelalte coloane ("id"
si "reg_date") sunt adaugate automat de serverul MySQL.
MySQL permite INSERT cu mai multor randuri in acelasi timp, separate
prin virgula.
- Sintaxa:
INSERT INTO nume_tabel (coloana1, coloana2, coloana3,...)
VALUES (valoareA1, valoareA2, valoareA3,...),
(valoareB1, valoareB2, valoareB3,...),
(valoareC1, valoareC2, valoareC3,...)
Exemplu urmator adauga doua noi randuri in tabelul "users", cu o singura
interogare.
<?php
// conectare la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql pentru users, INSERT INTO (doua randuri)
$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
VALUES ('MarPlo', 'peace', 'user@[Link]'),
('I_AM', 'love', 'address@[Link]')";
// Trimite interogarea $sql la MySQL pentru a introduce valorile
if ($conn->query($sql) === TRUE) {
echo 'Datele au fost adaugate';
}
else {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
Obtinere ID, auto generat de INSERT
Daca aveti un tabel cu o coloana AUTO_INCREMENT care stocheaza un id
numeric, puteti folosi metoda insert_id() a obiectului mysqli pentru a
prelua ID-ul generat in ultima operatiune INSERT.
- Exemplu:
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql pentru users, INSERT INTO
$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
VALUES ('PloMar ', 'love_light', 'a_name@[Link]')";
// Executa interogarea $sql pentru a prelua ID auto-generat
if ($conn->query($sql) === TRUE) {
echo 'ID-ul este: '. $conn->insert_id;
}
else {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
Returneaza:
ID-ul este 4
Daca tabelul nu are o coloana cu atributul AUTO_INCREMENT sau daca interogarea nu
este o comanda INSERT sau UPDATE, insert_id() va returna zero.
Adaugare date din formular in baza de date
Formularele HTML sunt de obicei folosite pentru a trimite date la un script
pe server. Aceste date pot fi adaugate si intr-o baza de date.
Pentru a introduce date dintr-un formular intr-o baza de date MySQL,
trebuie creat un formular HTML si un script PHP care receptioneaza date
din formular.
Exemplu de formular HTML si un script PHP care poate fi folosit pentru a
adauga valorile din formular in tabelul "users".
Formularul HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"[Link]
<html>
<head>
<title>Formular HTML pentru insert users</title>
</head>
<body>
<form action="[Link]" method="post">
Name: <input type="text" name="name" /><br />
Password: <input type="text" name="pass" /><br />
E-mail: <input type="text" name="email" /><br />
<input type="submit" valoare="Trimite" />
</form>
</body>
</html>
Cand un utilizator apasa pe butonul "Trimite", datele din formular sunt
trimise la scriptul din fisierul "[Link]".
Fisierul "[Link]":
- preia valorile din formular cu variabila $_POST,
- filtreaza aceste valori cu functii strip_tags() si trim() (pentru a sterge
posibile tag-uri si spatii goale de la inceput si sfarsit),
- foloseste un tipar RegExp si functia preg_match() pentru a verifica daca
valoarea de la "email" e o adresa de email corecta,
- daca toate datele sunt corecte, se face conectarea la o baza de date
(cu instanta mysqli), stocheaza valorile intr-un Array asociativ ($adds), si
le filtreaza cu metoda mysqli_real_escape_string(),
- seteaza comanda INSERT INTO , apoi, metoda query() trimite
interogarea SQL la serverul MySQL si o noua inregistrare va fi adaugata in
tabelul "users".
Cod PHP in pagina "[Link]"
<?php
$erors = array();
// seteaza un array gol care va contine erorile
$regexp_mail = '/^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})
$/';
// RegExp pt adresa de e-mail
// Verifica daca sunt primite date din formular
if (isset($_POST['name']) && isset($_POST['pass']) && isset($_POST['email'])) {
// sterge tag-urile si spatiile goale de la inceputul si sfarsitul valorilor
$_POST = array_map("strip_tags", $_POST);
$_POST = array_map("trim", $_POST);
// verifica daca toate campurile din formular sunt completate corect
// (adresa de email si numarul minim de caractere din "name" si "pass")
if (!preg_match($regexp_mail, $_POST['email'])) $erors[] = 'Adresa de e-mail
incorecta';
if (strlen($_POST['name'])<3) $erors[] = 'Numele trebuie sa contina minim 3
caracte';
if (strlen($_POST['pass'])<6) $erors[] = 'Parola trebuie sa contina minim 6
caracte';
// daca nu sunt erori ($error array gol)
if(count($erors)<1) {
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// stocheaza valorile intr-un Array, filtrand caracterele speciale pt. a fi folosite in
comanda SQL
$adds['name'] = $conn->real_escape_string($_POST['name']);
$adds['pass'] = $conn->real_escape_string($_POST['pass']);
$adds['email'] = $conn->real_escape_string($_POST['email']);
// interogarea SQL pentru userr, INSERT INTO
$sql = "INSERT INTO `users` (`name`, `pass`, `email`) VALUES ('".
$adds['name']. "', '". $adds['pass']. "', '". $adds['email']. "')";
// Trimite interogarea $sql la MySQL pentru a introduce valorile
if ($conn->query($sql) === TRUE) {
echo 'Datele au fost adaugate';
}
else {
echo 'Error: '. $conn->error;
}
$conn->close();
}
else {
// altfel, daca au aparut erori erori, le adauga intr-un sir si le printeaza
echo implode('<br />', $erors);
}
}
else {
echo 'Nu sunt date de la formular';
}
?>
PHP MySQL - SELECT, ORDER BY
Cand baza de date are cateva inregistrari in ea, puteti prelua informatia
stocata, folosind comanda SELECT.
O interogare SELECT returneaza randuri selectate de la unul sau mai
multe tabele.
- Sintaxa:
SELECT nume_coloana/e FROM nume_tabel
- "nume_coloana/e" - este numele coloanei sau coloanelor care vor fi
selectate.
Pentru a selecta mai multe coloane, adaugatile separate prin virgula:
SELECT coloana1, coloana2, coloana3 FROM nume_tabel
Pentru a selecta toate coloanele, punti un asterisc (*):
SELECT * FROM nume_tabel
Ca sa fie trimisa comanda SQL la baza de date MySQL si pentru a prelua
datele selectate, se foloseste metoda query() a obiectului mysqli.
Cand este folosita cu interogari SELECT, aceasta metoda returneaza un
obiect care contine randurile de date, sau False in caz de eroare.
Pentru a parcurge datele returnate si sa obtineti cate un rand din ele,
puteti folosi metoda fetch_assoc.
Metoda fetch_assoc() returneaza un array asociativ ce contine randurile
preluate, cheile din array reprezinta numele coloanelor.
Cu o bucla while() puteti prelua informatiile din fiecare rand stocat in acel
array.
Pentru a afla numarul de randuri returnat de o interogare SELECT, se
foloseste proprietatea num_rows, aplicata la obiectul rezultat.
- Urmatorul exemplu selecteza si afiseaza datele stocate in coloanele
"id", "name" si"pass" din tabelul "users".
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql SELECT
$sql = "SELECT `id`, `name`, `pass` FROM `users`";
// executa interogarea si retine datele returnate
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> id: '. $row['id']. ' - name: '. $row['name']. ' - pass: '. $row['pass'];
}
}
else {
echo '0 rezultate';
}
$conn->close();
?>
- Acest exemplu stocheaza datele (obiectul rezultat) returnate de metoda
query() in variabila $result , foloseste proprietatea "num_rows" sa verifice
daca $result contine cel putin un rand. Apoi, cu bucla while() trece prin
toate inregistrarie din obiecul rezultat, folosind metoda "fetch_assoc()"
pentru a retine datele din fiecare rand intr-un Array in variabila $row.
Fiecare apelare a fetch_assoc() returneaza urmatorul rand in setul de
rezultate, pana cand nu mai sunt, si returneaza False.
Pentru a accesa valorile din fiecare rand, se foloseste variabila PHP $row
si cheia cu numele coloanei ($row['id'], ...).
Codul de mai sus va afisa:
id:
id:
id:
id:
1
2
3
4
name:
name:
name:
name:
Marius - pass: faith
MarPlo - pass: peace
I_AM - pass: love
PloMar - pass: love_light
Asterisc (*) poate fi folosit pentru a selecta toate coloanele: "SELECT * FROM
nume_tabel", dar este mai bine sa specificati doar coloanele care vreti sa fie selectate,
deoarece procesul de selectare poate fi mai rapid.
Optiunea LIMIT
Cu optiunea LIMIT puteti sa determinati numarul de inregistrari pe care
MySQL le va returna:
- Sintaxa:
SELECT nume_coloana/e FROM nume_tabel LIMIT skip_nr, ret_nr
"skip_nr" este optional, ii spune bazei de date cate randuri sa sara din
rezultate.
"ret_nr" seteaza numarul maxim de inregistrari ce vor fi returnate.
- Exemplu:
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql SELECT
$sql = "SELECT `id`, `name`, `pass` FROM `users` LIMIT 2";
// executa interogarea si retine datele returnate
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> id: '. $row['id']. ' - name: '. $row['name']. ' - pass: '. $row['pass'];
}
}
else {
echo '0 rezultate';
}
$conn->close();
?>
Optiunea "LIMIT 2" spune MySQL sa returneze primele 2 randuri din
rezultat.
Acest exemplu va afisa:
id: 1 - name: Marius - pass: faith
id: 2 - name: MarPlo - pass: peace
ORDER BY
ORDER BY specifica ordinea de sortare a resultatelor.
- Sintaxa:
SELECT nume_coloana/e FROM nume_tabel ORDER BY nume_col ASC|DESC
"nume_col" poate fi o singura coloana, o lista de coloane separate prin
virgula, sau o expresie ca RAND(), pentru a obtine o ordine aleatorie.
Cand se ordoneaza dupa mai mult de o coloana, a doua coloana e folosita
in sortare doar daca valorile din prima coloana sunt egale.
Ordinea de sortare standard este ascendenta (ASC) (az, 09), iar
optiunea ASC poate fi omisa. DESC (descrescator) inverseaza ordinea.
- Exemplu:
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogarea sql SELECT
$sql = "SELECT `id`, `name`, `pass` FROM `users` ORDER BY `name`";
// executa interogarea si retine rezultatul
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> id: '. $row['id']. ' - name: '. $row['name']. ' - pass: '. $row['pass'];
}
}
else {
echo '0 results';
}
$conn->close();
?>
- Acest cod selecteaza toate datele stocate in tabelul "users" , si sorteaza
rezultatul in ordine alfabetica dupa coloana "name".
Exemplul de mai sus va afisa:
id:
id:
id:
id:
3
1
2
4
name:
name:
name:
name:
I_AM - pass: love
Marius - pass: faith
MarPlo - pass: peace
PloMar - pass: love_light
Puteti folosi ORDER BY cu optiunea LIMIT.
Exemplu:
"SELECT `id`, `name`, `pass` FROM `users`
ORDER BY `name` LIMIT 2"
Daca vreti sa ignore randurile duplicate (care au aceleasi valori), se
foloseste optiunea DISTINCT:
SELECT DISTINCT nume_coloana/e FROM nume_tabel
- Se pot de asemenea selecta coloane din tabele diferite, in aceeasi
interogare SQL, vedeti tutorialul Select in doua tabele MySQL.
PHP MySQL - WHERE si LIKE
Utilizare WHERE si operatori pentru a cauta valori specifi ce
Pentru a cauta valori specifice, pentru a extrage doar acele inregistrari
care respecta anumite criterii, se adauga o clauza WHERE in interogarea
SELECT.
Clauza WHERE este folosita pentru a filtra inregistrarile. Se adauga dupa
numele tabelului.
- Sintaxa:
SELECL nume_coloana/e FROM nume_tabel WHERE conditie
"conditie" - poate fi una sau mai multe expresii conditionale care specifica
criteriul de selectare. Aceste expresii conditionale pot folosi operatori de
comparatie, aritmetici si logici.
Tabelul urmator prezinta operatorii cei mai des folositi cu WHERE in
instructiunile MySQL:
Operator
Semnificatie
Exemplu
Egal
WHERE `id`=3
<
Mai mic decat
WHERE `id`<3
>
Mai mare decat
WHERE `id`>3
Operator
Semnificatie
Exemplu
<=
Mai mic sau egal cu
WHERE `id`<=3
>=
Mai mare sau egal cu
WHERE `id`>=3
!= (also <>)
Nu este egal cu
WHERE `id`!=3
IS NOT NULL
Are valoare
WHERE `id` IS NOT
NULL
Nu are valoare
WHERE `email` IS NULL
IS NULL
BETWEEN min AND Intr-un interval specific
max
(min si max)
WHERE `id` BETWEEN 2
AND 4
NOT
Nu este in intervalul (min WHERE `id` NOT
BETWEEN min AND
si max)
BETWEEN 2 AND 4
max
IN(val1, val2, val3)
Se gaseste in lista de
valori
WHERE `id` IN(1, 3, 4)
OR
Unde una din conditii
este adevarata
WHERE `id`>3 OR
`name`='MarPlo'
AND
Unde amandoua conditii WHERE `id`>3 AND
sunt adevarate
`name`='MarPlo'
- Exemplu (selecteaza toate randurile din tabelul "users" care au
"name=MarPlo" si afiseaza "id" si "email" din ele):
<?php
// conectare la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
$name = 'Marplo';
// seteaza numele intr-o variabila
// Interogare sql SELECT
$sql = "SELECT `id`, `email` FROM `users` WHERE `name`='$name'";
// executa interogarea si retine rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// afisaza datele pentru fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> id: '. $row['id']. ' - email: '. $row['email'];
}
}
else {
echo '0 results';
}
$conn->close();
?>
- Dupa cum observati, nu e necesar sa selectati coloana la care aplicati
conditia WHERE. Coloanele specificate dupa SELECT dicteaza ce coloane
sa returneze, iar coloanele adaugate dupa WHERE determina ce randuri
vor fi returnate.
- Nota, in interogarea $sql este folosita variabila ($name) care contine
numele, aceasta variabila este adaugata intre ghilimele simple in
interogare pentru ca MySQL sa preia valoarea ei ca tip sir (string).
Exemplul de mai sus va afisa:
id: 2 - email: user@[Link]
Clauza WHERE poate fi folosita si cu optiunile ORDER BY si LIMIT pentru
a ordona si limita datele selectate.
Exemplu:
$sql = "SELECT `name`, `pass` FROM
`users` WHERE `id`>2 ORDER BY `name` LIMIT 2";
In instructiunile SQL se pot adauga si expresii cu calcule matematice,
folosind caracterele adunare (+), scadere (-), inmultire (*), impartire (/), si
procent (%).
Exemplu:
$sql = "SELECT `name`, `pass` FROM
`users` WHERE `id`=($x + $y)";
LIKE, NOT LIKE
LIKE si NOT LIKE sunt termeni folositi pentru identificare valori de tip sir,
in combinatie cu urmatoarele caractere:
%
_
- reprezinta orice secventa de caractere sau niciuna.
(o sublinie), reprezinta exact un caracter.
Acesti termeni sunt folositi cu clauza WHERE, iar cautarea este caseinsensitive (fara diferenta intre litere mari si mici).
Exemple de interogari cu LIKE /NOT LIKE
<?php
// ...
#sql = "SELECT * FROM `nume_tabel` WHERE `name` LIKE 'mar%'";
// ...
?>
- Aceasta clauza WHERE se potriveste cu MarPlo, marius, Mars, si asa mai
departe, dar nu Omar.
<?php
// ...
#sql = "SELECT * FROM `nume_tabel` WHERE `name` NOT LIKE '%mar'";
// ...
?>
- Aceasta clauza WHERE se potriveste cu Mar, Omar, Romar, si asa mai
departe, dar nu cu Mars. ('%mar%' se potriveste cu Mars, Marius, Romars,
etc.).
<?php
// ...
#sql = "SELECT * FROM `nume_tabel` WHERE `name` NOT LIKE 'mar%'";
// ...
?>
- Aceasta interogare va returna toate randurile ale caror valoare "name"
nu incepe cu Mar.
<?php
// ...
#sql = "SELECT * FROM `nume_tabel` WHERE `name` LIKE 'mar_'";
// ...
?>
- Aceasta interogare va returna toate randurile ale caror valoare "name"
incepe cu Mar si are patru caractere (Mars, Mara, mar8, etc.).
Interogarile cu termeni LIKE sunt in general mai lente deoarece nu pot profita de indexi.
Pentru a cauta un simbol procent (%) sau o sublinie (_) in text, le precedati cu backslash,
in acest mod ( \% sau \_ ).
Sublinia poate fi folosita in combinatie cu ea insasi; (exemplu, LIKE '_ _' va cauta orice
combinatie de doua litere).
Cuvantul cheie LIKE trebuie sa fie intotdeauna urmat de un sir, chiar daca termenul cautat
este limitat la numere.
PHP MySQL - UPDATE
Dupa ce ati adaugat randuri in tabelul MySQL, puteti sa modificati
datele inregistrate, folosind comanda UPDATE.
Instructiunea UPDATE este folosita pentru a modifica sau actualiza
informatiile existente intr-un tabel.
- Sintaxa:
UPDATE nume_tabel
SET coloana1=valoare, coloana2=valoare2, ...
WHERE o_coloana=o_valoare
- Clauza WHERE este importanta intr-o interogare UPDATE , specifica
serverului MySQL care inregistrare sau inregistrari trebuie actualizate.
Daca omiteti clauza WHERE, vor fi afectate toate randurile!
- Comanda UPDATE este trimisa la serverul MySQL cu metoda query() a
obiectului mysqli.
- Exemplu
In lectiile anterioare a fost creat un tabel numita "users" si am adaugat
cateva randuri in el. Asa arata primele doua inregistrari.
i nam passw
d
e
ord
email
reg_date
Mariu
faith
s
name@domain. 2011-03-24
net
[Link]
MarPl
peace
o
user@domain.c 2011-03-24
om
[Link]
In acest exemplu vom modifica adresa de email pentru utilizatorul cu
"name" MarPlo.
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql UPDATE
$sql = "UPDATE `users` SET `email`='new_mail@[Link]' WHERE
`name`='MarPlo' AND `id`=2";
// executa interogarea si verifica pentru erori
if (!$conn->query($sql)) {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
Dupa cum observati, clauza WHERE pune doua conditii cu operatorul
"AND" (WHERE `name`='MarPlo' AND `id`=2), ii spune serverului MySQL
sa actualizeze numai randurile care au "name='MarPlo'" si "id=2". Setand
aceste doua conditii, putem fi siguri ca numai acel rand va fi modificat, nu
un alt rand cu acelasi nume.
De asemenea, puteti sa aplicati optiunea LIMIT pentru a seta cate randuri
sa fie actualizate.
Exemplu:
$sql = "UPDATE `users` SET
`email`='new_mail@[Link]' WHERE `name`='MarPlo' AND
`id`=2 LIMIT 1";
Dupa actualizare, primele doua randuri din tabelul "users" vor arata asa:
id name
passwor
d
email
reg_date
1 Marius faith
name@[Link]
2011-03-24
[Link]
2 MarPlo peace
new_mail@[Link]
m
2011-03-27
[Link]
- Deoarece "reg_date" este o coloana de tip TIMESTAMP (cu atribute: on
update CURRENT_TIMESTAMP ), serverul MySQL a modificat si valuarea ei,
actualizand-o cu data si ora curente (din momentul efectuarii UPDATE).
Daca vreti ca o instructiune UPDATE sa nu schimbe valoare coloanei
TIMESTAMP, cand creati tabelul trebuie sa nu adaugati atributul "on
update" , ci doar DEFAULT ( `coloana_data` TIMESTAMP NOT NULL
DEFAULT CURRENT_TIMESTAMP ).
- Daca executati o interogare UPDATE care nu modifica nici o valoare
(deoarece conditia WHERE nu se potriveste nici unui rand), nu va returna
vreo eroare si nici nu va afecta vreun rand.
- Este indicat sa nu schimbati valoarea unei coloane de tip PRIMARY KEY
(in exemplul de mai sus, coloana "id").
PHP MySQL - DELETE
Comanda DELETE este folosita pentru a sterge randuri din tabel.
- Sintaxa:
DELETE FROM nume_tabel WHERE conditie
Clauza WHERE conditie este foarte importanta, ea specifica exact care
rand sau randuri trebuie sterse. Este important sa o folositi, deoarece
randurile sterse nu mai pot fi recuperate, decat daca aveti undeva salvata
baza de date.
Daca nu adaugati WHERE, serverul MySQL va sterge toate inregistrarile
din tabel, lasandu-l gol.
Instructiunea DELETE este trimisa la serverul MySQL cu
metoda query() a obiectului mysqli.
- Exemplu
In lectiile anterioare a fost creat un tabel "users" si am adaugat cateva
date in el. Aici puteti vedea cum arata primele 3 randuri.
i
passwo
name
d
rd
email
reg_date
Mariu
faith
s
name@[Link]
MarPl
peace
o
new_mail@domain.c 2011-03-27
om
[Link]
3 I_AM
love
2011-03-24
[Link]
address@[Link] 2011-03-24
t
[Link]
In acest exemplu vom sterge inregistrarile din tabel, care au
name='MarPlo':
<?php
// Conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare DELETE
$sql = "DELETE FROM `users` WHERE `name`='MarPlo'";
// executa interogarea si verifica daca exista erori
if (!$conn->query($sql)) {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
- Acest cod va sterge toate randurile din tabelul "users" care au
name='MarPlo', astfel, daca in acest tabel sunt mai multi useri
(inregistrari) cu numele "MarPlo", MySQL le sterge pe toate.
Ca sa fiti sigur care inregistrare va fi stearsa, puteti sa adaugti inca o
conditie in clauza WHERE (cu operatorul AND), care impreuna cu prima
specifica mai exact ce rand sa fie sters.
De asemenea, se poate aplica optiunea LIMIT ca sa specificati cate
randuri sa fie sterse, din cele conform conditiei.
Example:
$sql = "DELETE FROM `users` WHERE `name`='MarPlo'
AND `id`=2 LIMIT 1";
Dupa stergere, primele trei randuri din tabelul "users" vor arata asa:
id name
passwor
d
email
reg_date
1 Marius faith
name@[Link]
2011-03-24
[Link]
3 I_AM
address@[Link]
2011-03-24
[Link]
4 PloMar love_light a_name@[Link]
2011-03-24
[Link]
love
- Dupa cum se observa, randul cu name='MarPlo' (id=2) a fost sters.
- Daca se executa o interogare DELETE care nu sterge nici o inregistrare
(deoarece conditia WHERE nu se potriveste cu nici un rand), nu veti primi
nici o eroare, si nu va fi afectat vreun rand.
Pentru a sterge complet un tabel, se foloseste DROP TABLE:
DROP TABLE nume_tabel
Pentru a sterge o intreaga baza de date, cu toate tabelele si informatiile
din ea, se foloseste DROP DATABASE:
DROP DATABASE database_name
MySQL Alias si functii
Alias
Un alias este creat folosing termenul AS urmat de un nume casesensitive. Se foloseste in interogari SELECT pentru a da unei coloane un
nume diferit in rezultatele returnate.
- Exemplu:
In exemplele din aceasta lectie se foloseste urmatorul tabel, denumit
"sites":
id
site
nr
reg_date
1 [Link]
2011-03-28 [Link]
2 [Link]
2011-03-28 [Link]
Acest exemplu selecteaza inregistrarile din coloana "site" si le returneaza
intr-un alias numit "st".
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql
$sql = "SELECT `site` AS st FROM `sites`";
// executa interogarea si retine rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// afisaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br />';
print_r($row);
}
}
else {
echo '0 rezultate';
}
$conn->close();
?>
In resultatele obtinute, valorile coloanei "site" vor fi returnate intr-un alt
nume de coloana, denumita 'st'.
Afiseaza:
Array ( [st] => [Link] )
Array ( [st] => [Link] )
Se pot folosi mai multe aliasuri intr-o interogare SELECT, cate unul pentru
fiecare coloana:
SELECT coloana1 AS nume1, coloana2 AS nume2
FROM nume_tabel
Aliasurile sunt de obicei folosite cu functii, pentru a returna rezultatul unei
functii asociat cu un nume (dupa cum vedeti in exemplu de mai jos).
- In mod standard, SQL nu suporta folosirea de aliasuri in interogari care
au conditionala WHERE.
Functii MySQL
Cele mai multe din functiile MySQL sunt folosite cu interogarea
SELECT pentru a formata datele returnate, dar puteti folosi functii MySQL
si cu alte tipuri de interogari.
Pentru a aplica o functie intr-o instructiune SELECT, la valoarea unei
coloane, interogarea va arata astfel:
- Sintaxa:
SELECT coloana1, FUNCTIE(coloana2), coloana3 FROM nume_tabel
Nu trebuie sa lasati spatii intre numele functiei si parateza ei.
Functii pentru Text
Functiile pentru text sunt folosite cand se lucreaza cu siruri, pot fi
aplicate fie cu numele coloanelor fie cu valori specifice.
Tabelul de mai jos contine cateva din cele mai utilizate functii MySQL
pentru lucru cu text ("t", poate fi text sau numele unei coloane).
Functie
Returneaza
CONCAT(t1,
t2, ...)
Un nou sir de forma "t1t2".
CONCAT_WS(S,
t1, t2, ...)
Un nou sir de forma t1St2S... (ignora coloanele care
nu au valori)
LENGTH(t)
Numarul de caractere din "t".
LEFT(t, y)
Caracterul "y" cel mai aproape de partea stanga din
"t".
RIGHT(t, x)
Caracterul "x" cel mai aproape de partea deapta din
"t".
TRIM(t)
"t" cu spatiile de la capete sterse.
UPPER(t)
"t" cu litere mari.
LOWER(t)
"t" cu litere mici.
SUBSTRING(t, x, caracterele "y" din "t", incepand de la index "x"
y)
(indexat de le 0).
expr REGEXP
patern
Executa o cautare in "expr", dupa o expresie regulata
specificata la "patern".
- In urmatorul exemplu vom folosi functia CONCAT() pentru a uni intr-un
singur sir valorile a doua coloane ("site" si "nr"), separate de o liniuta.
Acest sir va fi returnat cu un titlu de alias numit "str":
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica in caz de eroare la conectare
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql
$sql = "SELECT CONCAT(`site`, ' - ', `nr`) AS str FROM `sites`";
// executa interogarea si stocheaza rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// afisaza datele pentru fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br />'. $row['str'];
}
}
else {
echo '0 rezultate';
}
$conn->close();
?>
Aliasul "str" este cheia in array ce contine valorile returnate.
Codul de mai sus va returna:
[Link] - 5
[Link] - 8
Pentru lista completa cu functiile MySQL pt. text, vedeti manualul
MySQL: Functii pentru siruri.
Functii numerice
Functiile numerice sunt folosite in lucrul cu numere, pentru a efectua
operatii matematice. Ca si celelalte functii, ele pot fi utilizate fie cu
numele coloanelor fie cu valori specifice.
In tabelul urmator sunt prezentate cateva din functiile numerice MySQL
("n", poate fi un numar sau numele unei coloane).
Functia
Returneaza
ABS(n)
Valoarea absoluta a lui "n".
AVG(col)
Valoarea mijlocie (medie) a coloanei specificate.
CEILING(n) Urmatorul cel mai mare numar intreag dupa "n".
FLOOR(n)
Valoarea intreaga a lui "n".
FORMAT(n1 "n1" formatat ca un numar cu "n2" zecimale si cu virgula la
, n2)
fiecare 3 spatii.
MIN(col)
Valoarea minima din coloana specificata.
MAX(col)
Valoarea maxima din coloana specificata.
MOD(n1,
n2)
Resultatul impartirii lui "n1" la "n2". La fel ca si expresia cu
simbolul procent (n1%n2)
POW(n1,
n2)
"n1" la puterea "n2"
RAND()
Un numar aleatoriu intre 0 si 1.0
ROUND(n1,
"n1" rotunjit la "n2" zecimale.
n2)
SQRT(n)
Radical din "n".
Functia
SUM(col)
Returneaza
Suma valorilor din coloana specificata.
- In urmatorul exemplu vom selecta coloana "nr", cu functia POW()
aplicata ei, urmata de un alias care va contine valoarea returnata de
functia POW():
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql
$sql = "SELECT `nr`, POW(`nr`, 3) AS pow3 FROM `sites` ORDER BY pow3";
// executa interogarea si stocheaza rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo '<br /> POW('. $row['nr']. ', 3) - '. $row['pow3'];
}
}
else {
echo '0 rezultate';
}
$conn->close();
?>
Afiseaza:
POW(5, 3) - 125
POW(8, 3) - 512
- Functia RAND() poate fi folosita pentru a returna randurile intr-o ordine
aleatorie:
SELECT * FROM nume_tabel ORDER BY RAND()
Pentru lista completa cu functii numerice MySQL, vedeti manualul
MySQL: Functii numerice si operatori
Functii pentru Data si Ora
Coloanele specifice pt. Data si Ora din MySQL sunt destul de flexibile.
Daca vreti sa faceti calcule bazate pe o anume data sau sa returnati
numai numele zilei din saptamana, MySQL are o functie pentru aproape
fiecare scop de lucru cu Data si Ora.
Tabelul urmator contine cateva din cele mai utilizate functii MySQL pt.
lucru cu data si ora. Ele pot fi aplicate fie cu numele coloanelor, fie cu
valori specifice ("dt", poate fi o valoare sau numele unei coloane).
Functie
Returneaza
HOUR(dt)
Ora din "dt".
MINUTE(dt)
Minutul din "dt".
SECOND(dt)
Secundele din "dt".
DAYNAME(dt)
Numele zilei din saptaana a datei din "dt".
DAYOFMONTH(d
Numarul zilei din luna a datei din "dt".
t)
Functie
Returneaza
MONTHNAME(dt
Numele lunii din an a datei din "dt".
)
MONTH(dt)
Valoarea numerica a lunii din an, a datei din "dt".
YEAR(dt)
Anul din "dt".
CURDATE()
Data curenta.
CURTIME()
Ora curent.
NOW()
Data si ora curenta.
Timpul Unix (numarul de secunde trecute de la "1
UNIX_TIMESTAM
Ianuarie 1970 [Link] GMT" pana la momentul
P(dt)
curent sau pana la data specificata).
- Urmatorul exemplu afiseaza numele zilei din saptamana cand ultimul
site a fost inregistrat:
<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql
$sql = "SELECT `id`, `site`, DAYNAME(`reg_date`) AS weekday FROM `sites`
ORDER BY `reg_date` DESC LIMIT 1";
// executa interogarea si stocheaza rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// parcurge si afiseaza datele din fiecare rand din $result
while($row = $result->fetch_assoc()) {
echo 'Ultimul site web: '. $row['site']. ' , id: '. $row['id']. ' - a fost inregistrat intr-o
zi de '. $row['weekday'];
}
}
else {
echo '0 results';
}
$conn->close();
?>
Afiseaza:
Ultimul site web: [Link] , id: 2 - a fost inregistrata intr-o zi
de luni
Daca doriti sa preluati timpul UNIX dintr-o coloana de tip "Data si Timp",
folositi urmatoarea formula:
SELECT UNIX_TIMESTAMP(coloana_data) AS
nume_alias FROM nume_tabel
Exista multe alte functii pt. data si ora, puteti vedea lista completa in
manualul MySQL: Functii pentru Data si Ora.
PHP PDO - Introducere si Conectari la Baze de Date
PDO (PHP Data Objects) este o extensie PHP pentru accesare baze de
date in PHP.
PDO foloseste caracteristicile OOP (Programare Orientata pe Obiecte)
valabile incepand cu PHP 5.1.
Deoarece PDO lucreaza cu clase si obiecte, trebuie sa fiti familiarizati cu
modul de lucru al programarii orientate pe obiecte.
PDO poate lucra cu urmatoarele tipuri de baze de date:
MySQL
PostgreSQL
SQLite 2 & 3
Firebird
Informix (IBM Informix Dynamic Server)
ODBC
Oracle
DBLM: FreeTDS / Sybase / MS-SQL
IBM (IBM DB2)
- Unul din avantajele PDO este acela ca se folosesc functii similare pentru
interogarea si prelucrarea bazelor de date, indiferent de tipul lor (din cele
mentionate mai sus).
Script-urile care folosesc interfata PDO pentru conectare la baza de date
efectueaza in general urmatoarele operatii:
1. Conectare la serverul bazei de date, prin apelare new PDO(), obtinand un
obiect pentru lucru cu acea baza de date.
2. Aplicare functii specifice PDO pt. efectuarea interogarilor la baza de date.
3. Retinerea si prelucrarea datelor returnate.
4. Deconectarea de la server.
- Pentru a vedea daca PDO este valabil pentru baza dv. de date, se poate
verifica cu phpinfo(), unde e o sectiune PDO, sau cu
metodaPDO::getAvailableDrivers()
foreach(PDO::getAvailableDrivers() as $driver) {
echo $driver.'
';
}
1. Conectare la baza de date
Orice interactiune cu o baza de date incepe prin conectarea la ea. In
functie de tipul bazei de date se face intai conectarea, prin crearea unei
instante de obiect cu new PDO(). Dupa conectare se aplica metodele
PDO pentru retinerea si prelucrarea datelor, care in mare parte sunt
aceleasi, indiferent de baza de date conectata. Iata cum se face
conectarea la cateva din acestea:
Conectare la MySQL
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'numebd';
$userdb = 'username';
$passdb = 'password';
// Afiseaza mesaj daca s-a reusit conectarea, altfel, retine eventuala eroare
try {
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
echo 'Connected to database';
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- In variabila $dbh se creaza obiectul PDO in care vor fi stocate datele
transmise de la serverul MySQL. La aceasta instanta de obiect vor fi
aplicate metodele pentru prelucrarea datelor.
Observati ca s-a folosit formula try() ... catch(), aceasta pentru a nu
expune datele de conectare in cazul vreunei erori.
- De exemplu, folosind aceasta tehnica, daca numele bazei de date
este incorect, returneaza ceva de genul:
SQLSTATE[42000] [1049] Unknown database 'numebd'
- Daca numele sau parola sunt gresite, afiseaza ceva similar cu:
SQLSTATE[28000] [1045] Access denied for user 'numele'@'localhost'
(using password: YES)
Dar, daca s-ar folosi direct:
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'numebd';
$userdb = 'username';
$passdb = 'password';
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
?>
- Mesajul de eroare ar expune mai multe date, inclusiv parola, dupa
cum se vede mai jos:
Fatal error: Uncaught exception 'PDOException' with message
'SQLSTATE[28000] [1045] Access denied for user 'numele'@'localhost'
(using password: YES)' in E:\server\www\[Link] Stack trace: #0
E:\server\www\[Link](14): PDO->__construct('mysql:host=loca...',
'numele', 'parola') #1 {main} thrown in E:\server\www\[Link] on line 7
Deci, este indicata aplicarea formulei try() ... catch().
Conectare PostgreSQL
<?php
try {
$dbh = new PDO("pgsql:host=localhost port=5432 dbname=pdo", "username",
"password");
echo "PDO connection object created";
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
Conectare la SQLite
Cand PDO e folosit cu SQLite, trebuie specificata doar calea catre fisierul
cu baza de date. Daca acesta nu exista, va incerca sa-l creeze.
<?php
try {
// connect to SQLite database
$dbh = new PDO("sqlite:/path/to/[Link]");
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
Conectare la Firebird
Firebird este o baza de date folosita pe Windows.
<?php
try {
$dbh = new
PDO("firebird:dbname=localhost:C:\Programs\Firebird\[Link]", "SYSDBA",
"masterkey");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
Conectare la Informix
<?php
try {
$dbh = new PDO("informix:DSN=InformixDB", "username", "password");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
Conectare la Oracle
<?php
try {
$dbh = new PDO("OCI:dbname=accounts;charset=UTF-8", "username",
"password")
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
Conectare la ODBC
Exista mai multe conexiuni ODBC care pot fi create. Iata conectarea la o
baza de date MS Access, numita "accounts".
<?php
try {
$dbh = new PDO("odbc:Driver={Microsoft Access Driver
(*.mdb)};Dbq=C:\[Link];Uid=Admin");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
Conectare la DBLIB
O alta baza de date specifica Windows.
<?php
$hostdb = "localhost";
$port = 10060;
$namedb = "my_database";
$userdb = "username";
$passdb = "password";
try {
$dbh = new PDO ("dblib:host=$hostdb:
$port;dbname=$namedb","$userdb","$passdb");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
Conectare la IBM
Urmatorul exemplu arata conectarea la o baza de date IBM DB2 numita
"accounts".
<?php
try {
$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=accounts;
HOSTNAME=1.2.3,4;PORT=56789;PROTOCOL=TCPIP;", "username", "password");
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
2. Inchiderea conexiunii cu baza de date
In mod normal, PHP inchide conexiunea la baza de date dupa ce a fost
executat tot scriptul. Dar deconectarea se poate face si intentionat,
atribuind valoare null la obiectul PDO, dupa cum e prezentat in exemplu
de mai jos.
Instanta la acel obiect va fi distrusa, prin urmare, aceasta metoda
trebuie adaugata dupa ce au fost scrise toate instructiunile care trebuie
aplicate obiectului PDO.
- Deconectarea prin aceasta metoda este utila deoarece elibereaza
memoria folosita.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'numebd';
$userdb = 'username';
$passdb = 'password';
// Afiseaza mesaj daca s-a reusit conectarea, altfel, retine eventuala eroare
try {
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
echo 'Connected to database';
/* Instructiuni de lucru cu $dbh */
$dbh = null;
// Inchidere conexiune
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
In tutorialul urmator e prezentat modul de creare si adaugare date in
tabel MySQL, INSERT, UPDATE si DELETE folosind metoda PDO exec().
PHP PDO - exec (INSERT, UPDATE, DELETE) MySQL
Dupa ce se realizeaza cu succes conectarea la baza de date
(aici MySQL) si se creaza instanta de obiect PDO, poate fi utilizata
pentru executia de interogari SQL.
Interogarile SQL cu PDO pot fi facute in 2 moduri: direct (cu metodele
"exec()" si "query()"), sau cu declaratiile prepare() ... execute().
Prima varianta e mai simpla si in aceasta lectie va fi prezentata
metoda exec.
Comenzile care modifica randuri din tabel, dar nu returneaza un set de
rezultate cu randuri si coloane (INSERT, UPDATE), se transmit cu
metodaexec(), aceasta returneaza numarul de randuri afectate, sau
FALSE in caz de eroare.
$count = $dbh->exec("Comanda SQL");
Interogarile care selecteaza randuri (SELECT) si returneaza un set de
rezultate cu randuri si coloane se transmit cu metoda query(). In caz de
eroare da FALSE.
$res = $dbh->query("Interogare SQL");
Pentru a lucra cu baze de date in PHP trebuie cunoscute interogarile specifice SQL,
precum: CREATE TABLE, INSERT, SELECT, etc.
Cu PDO, PHP transmite aceste comenzi sub forma de sir la MySQL, daca nu le cunoasteti,
sunt prezentate in lectiile despre baze de date SQL, incepand cu Baze de date SQL.
1. Creare tabel MySQL
Crearea unui tabel MySQL folosind PDO se face prin metoda "exec()"
si instructiunea specifica SQL, "CREATE TABLE ...", sintaxa fiind:
$obiectPDO->exec("CREATE TABLE `nume_tabel`
(`coloana1` TIP, `coloana2` TIP, ...)");
- Toate aceste instructiuni se adauga dupa cea de creare a obiectului
PDO si conectare la MySQL.
In exemplu urmator se creaza in baza de date "teste" un tabel denumit
"sites", cu 4 coloane: "id", "nume", "categorie" si "adresa".
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Creare tabel
$sql = "CREATE TABLE `sites` (`id` int(8) NOT NULL AUTO_INCREMENT PRIMARY
KEY , `nume` varchar(70) NOT NULL DEFAULT '', `categorie` varchar(25), `adresa`
varchar(100)) CHARACTER SET utf8 COLLATE utf8_general_ci";
if($dbh->exec($sql) !== false) echo 'Tabelul sites e creat';
diferit de false, afiseaza confirmare
$dbh = null;
}
// Deconectare
// Daca rezultatul e
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- Daca tabelul e creat, afiseaza:
Tabelul sites e creat
- Prin "exec("SET CHARACTER SET utf8")" seteaza ca transferul de date
dintre PHP si serverul MySQL sa se faca in format de caractere UTF-8. Este
indicata adaugarea acestei instructiuni cand se lucreaza cu date ce contin
diacritice si caractere mai putin uzuale, dar in scriptul PHP trebuie aplicat
si header-ulheader('Content-type: text/html; charset=utf-8');.
2. INSERT
Dupa ce tabelul MySQL este creat, se pot adauga randuri cu date in el.
Acest lucru se face cu instructiunea INSERT, prin metoda exec().
Sintaxa generala este:
$obiectPDO->exec("INSERT INTO `nume_tabel` (`coloana1`,
`coloana2`, ...) VALUES ('valoare1', 'valoare2', ...));
Iata cum se aplica.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Adaugare date
// Setare encoding caractere UTF-8
$sql = "INSERT INTO `sites` (`nume`, `categorie`, `adresa`)
VALUES
('Cursuri - Tutoriale', 'educatie', '[Link]'),
('Curs PHP-MySQL', 'programare', '[Link]/php-mysql'),
('Cursuri Engleza', 'limbi straine', '[Link]/engleza')";
$count = $dbh->exec($sql);
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
// Daca datele au fost adaugate ($coun nu e false) afiseaza nr. randuri adaugate
if($count !== false) echo 'Nr. randuri adaugate: '. $count;
?>
- Acest cod adauga 3 randuri in tabelul "sites". Variabila $count retine
numarul de randuri afectate (adaugate) si script-ul va afisa:
Nr. randuri adaugate: 3
Tabelul "sites" va arata astfel:
| id | | nume
| | categorie
| | adresa
-----------------------------------------------------------------------------------------------------------| 1 | | Cursuri - Tutoriale
| | educatie
| | [Link]
| 2 | | Curs PHP-MySQL
| | programare
| | [Link]/php-mysql |
| 3 | | Cursuri Engleza
| | limbi straine
| | [Link]/engleza
|
|
Pentru a obtine ultimul "id" adaugat cu INSERT intr-o coloana
AUTO_INCREMENT PRIMARY KEY, se foloseste metoda lastInsertId().
- Atentie, cand sunt adaugate mai multe randuri in aceeasi
instructiune INSERT, va returna id-ul primului rand adaugat (ca si cum se
adauga un singur rand).
UPDATE si DELETE sunt instructiuni SQL care modifica date din tabel,
dar nu returneaza un set de rezultate cu randuri si coloane, acestea (la
fel ca INSERT) pot fi executate in PDO cu metoda exec().
3. UPDATE
Dupa ce sunt adaugate date in tabelul MySQL, acestea pot fi modificate
cu instructiunea UPDATE. Formula generala aplicata cu PDO este:
$obiectPDO ->exec("UPDATE `nume_tabel` SET
`coloana1`='valoare1', `coloana2`='valoare2' WHERE conditie");
In urmatorul exemplu se modifica datele din coloanele "nume" si
"adresa", unde "id" are valoarea 3, din tabelul "sites", creat mai sus.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Modificare date din coloanele "nume" si "adresa", unde id=3
$sql = "UPDATE `sites` SET `nume`='Cursuri Spaniola',
`adresa`='[Link]/spaniola' WHERE `id`=3";
$count = $dbh->exec($sql);
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
// Daca interogarea e facuta cu succes ($count diferit de false)
if($count !== false) echo 'Randuri afectate: '. $count;
afectate
// Afiseaza nr. randuri
?>
- In browser va afisa:
Randuri afectate: 1
In unele situatii se poate ca UPDATE sa nu afecteze vreun rand si va returna 0. De
aceea este indicata verificarea prin conditia if($count !== false).
- E gresit if(!$count)
4. DELETE
Instructiunea DELETE sterge randuri din tabel. Formula generala
aplicata cu PDO este:
$obiectPDO ->exec("DELETE FROM `nume_tabel`
WHERE conditie");
In urmatorul exemplu se sterg toate randurile din tabelul "sites" care au
coloana "categorie" cu valoarea "educatie" sau "programare".
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Stergere randuri in functie de campul "categorie"
$sql = "DELETE FROM `sites` WHERE `categorie` IN('educatie', 'programare')";
$count = $dbh->exec($sql);
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
// Daca interogarea e facuta cu succes ($count diferit de false)
if($count !== false) echo 'Randuri afectate: '. $count;
afectate
// Afiseaza nr. randuri
?>
- In browser va afisa:
Randuri afectate: 2
- In lectia urmatoare sunt prezentate modul in care se poate selecta si
prelua date din tabelul MySQL cu metoda PDO query().
PHP PDO - Select, fetch
Pentru selectare date dintr-un tabel MySQL se foloseste instructiunea
SELECT, iar prin metode fetch specifice PDO datele cu randurile
selectate primite de la serverul MySQL pot fi preluate in mai multe
moduri, cu metode si constante FETCH.
1. Selectare date din tabel MySQL
Dupa ce tabelul MySQL este creat si are randuri adaugate, se aplica
interogarea SELECT pentru a obtine date din randurile tabelului. Se
poate folosi metoda query(), aceasta returneaza un set de rezultate cu
datele obtinute de la MySQL, sau FALSE in caz de eroare.
In exemplele prezentat aici se foloseste tabelul creat in lectia anterioara,
care arata astfel:
| id | | nume
| | categorie
| | adresa
-----------------------------------------------------------------------------------------------------------| 1 | | Cursuri - Tutoriale
| | educatie
| | [Link]
| 2 | | Curs PHP-MySQL
| | programare
| | [Link]/php-mysql |
| 3 | | Cursuri Engleza
| | limbi straine
| | [Link]/engleza
|
|
- In urmatorul exemplu vor fi selectate randurile in care "id" este 1 sau 3.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selectare date
$sql = "SELECT * FROM `sites` WHERE `id` IN (1, 3)";
$datas = $dbh->query($sql);
// Daca select-ul e facut cu succes ($datas nu e false)
if($datas !== false) {
$cols = $datas->columnCount();
// Numar coloane returnate
echo 'Nr. coloane returnate: '. $cols. '<br />';
// Se parcurg si afiseaza datele selectate
foreach($datas as $row) {
echo $row['id']. ' - '. $row['nume']. ' - '. $row['categorie']. ' - '. $row['adresa'].
'<br />';
}
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- Metoda "columnCount()" returneaza numarul de coloane din setul de
rezultate. Observati ca se aplica la instanta in care s-a executat
interogarea (aici variabila $datas).
- Parcurgerea datelor se poate face si cu WHILE, while($row=$datas>fetch()), in acest caz trebuie aplicata si metoda "fetch()" (este
prezentata mai jos).
- Scriptul de mai sus va afisa:
Nr. coloane returnate: 4
1 - Cursuri - Tutoriale - educatie - [Link]
3 - Cursuri Engleza - limbi straine - [Link]/engleza
2. Metoda fetch()
fetch() returneaza fiecare rand, unul dupa altul, sau FALSE cand nu
mai sunt randuri. Cu aceasta metoda se poate determina modul in care
sunt preluate datele.
fetch() poate primi optional un argument prin care se determina modul
in care valorile sunt returnate: Array, Obiect, Sir, .... Acest argument este
o constanta care se aplica cu sintaxa:
PDO::FETCH_MOD
In continuare sunt prezentate cateva din aceste moduri, cele mai
comune:
FETCH_ASSOC
- Returneaza fiecare rand ca un Array in care cheile sunt numele
coloanelor (similar cu mysql_fetch_assoc).
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selectare date din MySQL
$sql = "SELECT * FROM `sites`";
$datas = $dbh->query($sql);
// Se parcurg datele si le afiseaza
while($row = $datas->fetch(PDO::FETCH_ASSOC)) {
echo $row['id']. ' - '. $row['nume']. ' - '. $row['categorie']. ' - '. $row['adresa'].
'<br />';
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- In browser apare:
1 - Cursuri - Tutoriale - educatie - [Link]
2 - Curs PHP-MySQL - programare - [Link]/php-mysql
3 - Cursuri Engleza - limbi straine - [Link]/engleza
FETCH_NUM
- Returneaza fiecare rand ca un Array in care cheile sunt numere
consecutive (incepand de la 0), reprezentand ordinea coloanelor din setul
de rezultate (similar cu mysql_fetch_row).
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selectare date din MySQL
$sql = "SELECT * FROM `sites`";
$datas = $dbh->query($sql);
// Se parcurg datele
while($row = $datas->fetch(PDO::FETCH_NUM)) {
echo $row[0]. '-'. $row[1]. '<br />';
coloana
// Afiseaza datele din prima si a doua
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- In browser afiseaza:
1-Cursuri - Tutoriale
2-Curs PHP-MySQL
3-Cursuri Engleza
FETCH_BOTH
- Produce un Array cu ambele tipuri de chei, atat numele coloanelor cat si
numere consecutive reprezentand ordinea coloanelor din setul de
rezultate.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selectare date din MySQL, unde "id" are valoarea 2
$sql = "SELECT `id`, `nume` FROM `sites` WHERE `id`=2";
$datas = $dbh->query($sql);
// Se parcurg datele
while($row = $datas->fetch(PDO::FETCH_BOTH)) {
echo $row['id']. '-'. $row['nume']. '<br />';
si 'nume'
echo $row[0]. '-'. $row[1]. '<br />';
(aceleasi)
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- In browser apare:
2-Curs PHP-MySQL
2-Curs PHP-MySQL
// Afiseaza datele din coloanele 'id'
// Afiseaza din prima si a doua coloana
FETCH_OBJ
- Returneaza fiecare rand ca un obiect. Valorile coloanelor se acceseaza
ca proprietati ale obiectului, prin numele lor.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selectare date din MySQL, randuri cu "id" mai mic decat 3
$sql = "SELECT `id`, `nume` FROM `sites` WHERE `id`<3";
$datas = $dbh->query($sql);
// Se parcurg datele
while($row = $datas->fetch(PDO::FETCH_OBJ)) {
echo $row->id. '-'. $row->nume. '<br />';
si 'nume'
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- Va afisa:
1-Cursuri - Tutoriale
2-Curs PHP-MySQL
// Afiseaza datele din coloanele 'id'
FETCH_CLASS
- Permite ca datele sa fie preluate intr-o clasa, creand o instanta de obiect
la acea clasa. Numele campurilor sunt folosite ca proprietati in acea clasa.
Se aplica cu metoda fetchALL().
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
// Definire clasa
class Sites {
// Definire proprietati
public $id;
public $categorie;
// Metoda a clasei
function makeString() {
// Returneaza un sir cu valorile proprietatilor, cu primul caracter din cuvinte
majuscula
return ucwords($this->id. ' - '. $this->categorie). '<br />';
}
}
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selectare date din MySQL, coloanele "id" si "categorie"
$sql = "SELECT `id`, `categorie` FROM `sites`";
$datas = $dbh->query($sql);
$obj = $datas->fetchALL(PDO::FETCH_CLASS, 'Sites');
la clasa Sites
// Aplicare FETCH_CLASS
// Parcurge datele din setul de rezultate, creaza instanta de clasa $insSites
foreach($obj as $insSites) {
echo $insSites->makeString();
clasei
// Apeleaza metoda makeString() la instanta
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- Observati cum e aplicat FETCH_CLASS, la metoda "fetchALL()" si cu un
argument tip sir ce reprezinta numele clasei (aici "Sites").
- Acesta metoda e utila in cazul unor proiecte mai mari, definind intr-o
clasa instructiunile ce trebuie aplicate datelor primite de la baza de date
se poate reduce cantitatea de cod si se imbunatateste flexibilitatea
scriptului.
- Script-ul va afisa:
1 - Educatie
2 - Programare
3 - Limbi Straine
O alternativa la FETCH_CLASS este metoda fetchObject(). Similar, si cu
aceasta datele din coloanele fiecarui rand din cele obtinute la "query()"
sunt preluate printr-o clasa care este adaugata ca argument la metoda.
Exemplu:
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
// Definire clasa
class Sites {
// Definire proprietati
public $id;
public $categorie;
// Metoda a clasei
function makeString() {
// Returneaza un sir cu valorile proprietatilor, primul caracter al cuvintelor
majuscula
return ucwords($this->id. ' - '. $this->categorie). '<br />';
}
}
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selectare date din MySQL, coloanele "id" si "categorie"
$sql = "SELECT `id`, `categorie` FROM `sites`";
$datas = $dbh->query($sql);
// Parcurgere instanta de obiect creata cu fetchObject() la clasa Sites
while($obj = $datas->fetchObject('Sites')) {
echo $obj->makeString();
makeString()
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
// Afiseaza rezultatul apelarii metodei
- Numele coloanelor din fiecare rand sunt folosite ca proprietati ale clasei
apelate (aici Sites)
- In browser apare:
1 - Educatie
2 - Programare
3 - Limbi Straine
FETCH_FUNC
- O alta constanta FETCH_ care se aplica la metoda fetchALL() este
FETCH_FUNC. Returneaza un Array cu rezultatul apelarii unei functii,
folosind ca argumente coloanele fiecarui rand din setul de rezultate.
Cheile din Array sunt numere consecutive (de la 0), iar valoarea lor e
rezultatul dat de functie pt. fiecare rand.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
// Definire functie
function test($id, $nume) {
// Returneaza un sir cu datele din parametri, cu majuscule
return strtoupper($id.'-'.$nume);
}
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selectare date din MySQL
$sql = "SELECT `id`, `nume` FROM `sites`";
$datas = $dbh->query($sql);
$ar_row = $datas->fetchALL(PDO::FETCH_FUNC, 'test');
FETCH_FUNC la functia test()
// Aplicare
var_export($ar_row);
$dbh = null;
// Afiseaza structura Array-ului
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- Acest mod este util cand se doreste aplicarea acelorasi instructiuni la
mai multe seturi de date obtinute din tabel MySQL, astfel, pot fi toate
definite intr-o functie.
- Rezultatul afisat este:
array ( 0 => '1-CURSURI - TUTORIALE', 1 => '2-CURS PHP-MYSQL', 2 =>
'3-CURSURI ENGLEZA', )
Metoda query() accepta, dupa interogarea SQL, si un argument
optional ce reprezinta modul-fetch.
Exemplu:
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selectare date din MySQL, unde "id" este 3
$sql = "SELECT `id`, `adresa` FROM `sites` WHERE `id`=3";
$datas = $dbh->query($sql, PDO::FETCH_OBJ);
fetch
// Aplicare query() cu un mod-
// Se parcurg datele
while($row = $datas->fetch()) {
echo $row->id. '-'. $row->adresa. '<br />';
"id" si "adresa"
// Afiseaza datele din coloanele
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- In browser apare:
[Link]/engleza
Daca metoda fetch() este apelata fara argumente si la "query()" nu e specificat vreun
tip FETCH_, modul implicit (default) este PDO::FETCH_BOTH.
- O alta metoda prin care se poate seta modul FETCH_ default este setFetchMode().
Ex.:
$datas = $dbh->query($sql);
$datas->setFetchMode (PDO::FETCH_OBJ);
while($row = $datas->fetch()) { // ... }
- Mai multe detalii la pagina oficiala setFetchMode
In tutorialul urmator este prezentat modul de utilizare al metodelor
prepare() si execute().
PHP PDO - prepare si execute
Cu metodele exec() si query() se executa imediat comenzile SQL
adaugate in ele. Cu PDO e posibil sa fie pregatita o interogare SQL
pentru executie fara ca sa fie transmisa imediat, pentru aceasta se
foloseste metoda prepare().
prepare() preia ca argument o declaratie SQL si returneaza un obiect
PDOStatement. Acest obiect are o metoda execute() prin care se
executa declaratia SQL cand se doreste acest lucru, returneaza TRUE sau
FALSE in caz de eroare. Sintaxa generala de aplicare este:
$obj = $obiectPDO->prepare("Interogare SQL");
$obj->execute(Array);
- La "Interogare SQL" se poate aplica orice instructiune pt. SQL: INSERT,
SELECT, UPDATE, DELETE.
- Argumentul Array de la execute() e optional, acesta reprezinta un Array
cu parametri ce corespund declaratiei SQL de la prepare(), si valorile
care vor fi transmise la MySQL.
In exemplele prezentate in aceasta lectie se foloseste tabelul "sites",
creat si utilizat in lectiile anterioare, care arata astfel:
| id | | nume
| | categorie
| | adresa
-----------------------------------------------------------------------------------------------------------| 1 | | Cursuri - Tutoriale
| | educatie
| | [Link]
| 2 | | Curs PHP-MySQL
| | programare
| | [Link]/php-mysql |
| 3 | | Cursuri Engleza
| | limbi straine
| | [Link]/engleza
|
|
Iata explicat mai bine printr-un exemplu cum se aplica sintaxa de mai sus
intr-un script PHP cu PDO. Acesta va defini cu "prepare()" o comanda SQL
prin care va selecta din tabel randurile in functie de valorile adaugate prin
"execute()".
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Definire comanda SQL care va fi aplicata in metoda prepare()
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`= :id OR
`categorie`= :categorie";
$prep = $dbh->prepare($sql);
// Interogarea e pregatita si stocata in $prep
// Variabila Array cu valori ce trebuie adaugate in interogarea SQL pregatita (pt.
':id' si ':categorie')
$ar_val = array('id'=>2, 'categorie'=>'educatie');
// Daca se executa cu succes interogarea, folosind execute() si valorile din $ar_val
if($prep->execute($ar_val)) {
// Parcurge si afiseaza randurile obtinute
while($row = $prep->fetch()) echo $row['nume'].' - '.$row['adresa'].'<br />';
}
/* Se executa inca o selectare, cu alte valori, aplicata aceleiasi declaratii SQL */
echo 'Select-ul 2<br />';
// Variabila Array cu valori ce trebuie adaugate in interogarea SQL pregatita (pt.
':id' si ':categorie')
$ar_val = array('id'=>8, 'categorie'=>'limbi straine');
// Daca se executa interogarea, folosind execute() si valorile din $ar_val
if($prep->execute($ar_val)) {
// Parcurge si afiseaza randurile obtinute
while($row = $prep->fetch()) echo $row['nume'].' - '.$row['adresa'].'<br />';
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- In expresia $sql = "SELECT `nume`, `adresa` FROM `sites` WHERE
`id`= :id OR `categorie`= :categorie";, ":id" si ":categorie" sunt parametri
pentru valorile care vor fi preluate din Array, de la elementele cu aceeasi
denumire la chei ('id' si 'categorie'). Datorita acestei notatii se poate folosi
aceeasi comanda SQL pregatita, cu valori diferite.
- Observati cat de usor se pot efectua mai multe interogari la baza de
date, folosind aceeasi declaratie SQL, doar prin apelarea lui "execute()" cu
valorile dorite.
Script-ul va afisa:
Cursuri - Tutoriale - [Link]
Curs PHP-MySQL - [Link]/php-mysql
Select-ul 2
Cursuri Engleza - [Link]/engleza
In declaratia SQL pregatita, in loc de sintaxa :nume pentru locul valorilor se poate
folosi caracterul ?, dar in acest caz, Array-ul cu valorile trebuie sa fie secvential (adica cu
chei numere incepand de la 0), valorile vor fi preluate si adaugate la SQL in ordinea lor.
De exemplu:
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`=? OR
`categorie`=?";
$prep = $dbh->prepare($sql);
$prep->execute(array(2, 'programare'));
bindValue si bindParam
Un alt mod de a transmite valori la o interogare SQL pregatita cu
"prepare()" este utilizarea metodei bindValue() sau bindParam().
Utilizarea acestor metode in loc de Array are avantajul ca ofera un
control mai bun asupra valorilor transmise, putand fi specificate prin
atributele lor tipul de date si chiar numarul de caractere ce-l va avea
valoarea transmisa. Ele se aplica la obiectul PDOStatement obtinut cu
"prepare()".
Diferenta dintre bindValue si bindParam este:
La bindValue se adauga direct valoarea si optional se poate
specifica numarul de caractere ce vor fi transmise. Sintaxa generala este:
bindValue(paramSQL, valoare, tip, nr_caractere)
- paramSQL este parametrul din declaratia SQL, specificat cu :nume,
intre ghilimele. Daca e folosit semnul-intrebarii ?, la paramSQL se adauga
numarul de ordine (incepand cu 1) al acelui parametru.
- tip e optional, la el se precifica o constanta prin care se defineste tipul
de date care trebuie transmis: PDO::PARAM_INT pt. numere intregi,
PDO::PARAM_STR pentru siruri.
- La nr_caractere se adauga, optional, numarul de caractere ce va fi
transmis.
De exemplu:
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`= :id OR
`categorie`= :categorie";
$prep = $dbh->prepare($sql);
$prep->bindValue(':id', 2, PDO::PARAM_INT);
coloana "id"
// Transmite valoarea 2 la
$prep->bindValue(':categorie', 'programare', PDO::PARAM_STR, 10);
Transmite valoarea "programare" la coloana "categorie"
//
$prep->execute();
La bindParam se adauga valoarea prin variabile. Sintaxa generala
este:
bindParam(paramSQL, $var_val, tip)
- paramSQL este parametrul din declaratia SQL, specificat cu :nume,
intre ghilimele. Daca e folosit semnul-intrebarii ?, la paramSQL se adauga
numarul de ordine (incepand cu 1) al acelui parametru.
- $var_val e o variabila in care e stocata valoarea.
- tip e optional, la el se precifica o constanta prin care se defineste tipul
de date care trebuie transmis: PDO::PARAM_INT pt. numere intregi,
PDO::PARAM_STR pentru siruri.
De exemplu:
$sql = "SELECT `nume`, `adresa` FROM `sites` WHERE `id`=? OR `categorie`=?";
$prep = $dbh->prepare($sql);
$id = 2;
$cat = 'programare';
$prep->bindParam(1, $id, PDO::PARAM_INT);
// Transmite valoarea din
variabila $id la coloana de la primul ? (adica "id")
$prep->bindParam(2, $cat, PDO::PARAM_STR);
// Transmite valoarea din
variabila $cat la coloana de la al doilea ? (categorie)
$prep->execute();
Iata si un exemplu practic cu aceste doua metode, aplicat la tabelul
"sites". Se adauga doua randuri in tabel, unul dupa altul; primul
folosindbindValue(), iar al doilea cu bindParam()
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Definire comanda SQL care va fi aplicata in metoda prepare()
$sql = "INSERT INTO `sites` (`nume`, `categorie`, `adresa`) VALUES (:nume,
:categorie, :adresa)";
$prep = $dbh->prepare($sql);
// Interogarea e pregatita si stocata in $prep
// Se adauga valori cu bindValue
$prep->bindValue(':nume', 'Curs Ajax', PDO::PARAM_STR);
$prep->bindValue(':categorie', 'programare', PDO::PARAM_STR);
$prep->bindValue(':adresa', '[Link]/ajax', PDO::PARAM_STR);
// Daca datele sunt adaugate cu succes, afiseaza confirmare cu id-ul randului
if($prep->execute()) echo 'A fost adaugat randul cu id='. $dbh->lastInsertId();
// Se definesc variabile cu valori ce vor fi incluse cu bindParam
$nume = 'Jocuri Flash';
$categorie = 'jocuri';
$adresa = '[Link]/jocuri';
// Se includ variabilele
$prep->bindParam(':nume', $nume, PDO::PARAM_STR);
$prep->bindParam(':categorie', $categorie, PDO::PARAM_STR);
$prep->bindParam(':adresa', $adresa, PDO::PARAM_STR);
// Daca datele sunt adaugate cu succes, afiseaza confirmare cu id-ul randului
if($prep->execute()) echo '<br />A fost adaugat randul cu id='. $dbh>lastInsertId();
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- In browser va afisa:
A fost adaugat randul cu id=4
A fost adaugat randul cu id=5
Utilizarea combinatiei prepare() ... execute() este adesea mai rapida
decat query() / execute(). In plus, aceasta formula este utila cand trebuie
folosita de mai multe ori aceeasi declaratie SQL, cu parametri diferiti.
Un alt avantaj e acela ca datele ce trebuie transmise la serverul MySQL
sunt mai clar separate de comanda SQL, in plus sunt si filtrate. De
exemplu, daca se transmite cu o metoda "bind" sirul "a' b' c", PDO include
sirul "a\' b\' c".
Daca interogarea SQL contine instructiunea LIKE cu un parametru,
caracterul '%' trebuie adaugat la valoarea transmisa.
De exemplu:
// incorect
$prep = $dbh->prepare("SELECT `coloana` FROM `tabel` WHERE `coloana` LIKE
%:cuvant%");
$prep->bindValue(':cuvant', 'valoare');
// E CORECT
$prep = $dbh->prepare("SELECT `coloana` FROM `tabel` WHERE `coloana` LIKE
:cuvant");
$prep->bindValue(':cuvant', '%valoare%');
- In lectia urmatoare va fi prezentat lucru cu metodele: setAttribute(),
beginTransaction() si commit().
PHP PDO - setAttribute si beginTransaction
Cand se creaza un obiect PDO cu o conexiune la o baza de date, daca
apare vreo eroare in transmiterea de comenzi la baza de date determina
lansarea PDOException. Daca eroarea nu e preluata cu try ...
catch() PHP va opri executia scriptului.
PDOException este o extensie a clasei PHP Exception, prin care pot fi
"prinse" erorile.
Cu formula try ... catch(), pe langa faptul ca eroarea e preluata iar
scriptul isi continua executia, se poate de asemenea si personaliza
mesajul ce va fi afisat. Sintaxa generala este:
try {
// ... Instructiuni PHP-PDO
}
catch(PDOException $e) {
echo 'Mesaj de eroare personalizat';
echo $e->getCode(). '-'. $e->getMessage();
codul si mesajul erorii dat de PHP
}
// Afiseaza
- Variabila $e reprezinta obiectul in care e stocata eroare detectata de
PHP.
- Metoda getCode() returneaza codul erorii, iar getMessage() mesajul
acelei erori. Daca acestea nu sunt adaugate, apare doar mesajul
personalizat.
1. setAttribute
Cu metoda PDO setAttribute() se pot seta diferite atribute la obiectul
PDO prin care se face conexiunea la baza de date, printre care si modul
de raportare a erorilor retinute cu "try ... catch()".
Formula generala de aplicare a acestei metode este:
$obiectPDO->setAttribute(ATRIBUT, OPTIUNE)
- ATTRIBUT reprezinta tipul atributului care va fi aplicat, iar OPTIUNE este
optiunea lui, cum ar fi:
PDO::ATTR_CASE - forteaza ca numele coloanelor sa fie returnate intr-un
mod specific, determinat cu una din urmatoarele optiuni:
o PDO::CASE_LOWER - denumirea coloanelor va fi returnata cu
litere mici.
o PDO::CASE_UPPER - numele coloanelor e retinut cu litere mari.
o PDO::CASE_NATURAL - lasa numele coloanelor asa cum sunt
returnate de baza de date
PDO::ATTR_ERRMODE - atribut folosit pentru specificarea modului de
raportare a erorillor, prin urmatoarele constante:
o PDO::ERRMODE_SILENT - determina ignorarea erorii, scriptul
trece mai departe fara sa returneze ceva legat de eroarea
respectiva.
o PDO::ERRMODE_WARNING - emite eroarea ca avertisment
PHP standard.
o PDO::ERRMODE_EXCEPTION - returneaza informatia despre
eroare, data de PDOException.
Iata cum se aplica si ce rezultate da metoda setAttribute(), va fi utilizat
acelasi tabel MySQL din lectiile precedente (denumit "sites").
- In urmatorul exemplu se foloseste atributul PDO::ATTR_CASE cu optiunea
PDO::CASE_UPPER.
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Seteaza ca numele coloanelor sa fie returnat cu majuscule
$dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
// Selecteaza primul rand
$sql = "SELECT * FROM `sites` LIMIT 1";
$datas = $dbh->query($sql)->fetch(PDO::FETCH_ASSOC);
interogarea si preia in modul FETCH_ASSOC
// Executa
// Daca select-ul e facut cu succes ($datas nu e false)
if($datas !== false) {
// Se parcurg datele si afiseaza numele coloanelor
foreach($datas as $col=>$row) {
echo ' - '. $col;
}
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
- Script-ul va afisa in browser numele coloanelor, cu majuscule:
- ID - NUME - CATEGORIE - ADRESA
- In exemplu urmator se foloseste metoda setAttribute() pentru a afisa
in caz de eroare modul standard returnat de PHP. Se aplica atributul
PDO::ATTR_ERRMODE cu optiunea PDO::ERRMODE_WARNING. Pentru a
forta generarea erorii, se face un SELECT la o coloana ce nu exista in
tabelul "sites".
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
// Seteaza ca mod pt. erori cel standard PHP
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$dbh->exec("SET CHARACTER SET utf8");
// Setare encoding caractere UTF-8
// Selecteaza primul rand
$sql = "SELECT `zzz` FROM `sites` LIMIT 1";
$datas = $dbh->query($sql);
// Executa interogarea
// Se parcurg datele si afiseaza ce e in coloana 'zzz'
foreach($datas as $row) {
echo $row['zzz'];
}
$dbh = null;
// Deconectare
}
catch(PDOException $e) {
echo $e->getMessage();
}
- Deoarece coloana "zzz" nu exista, va emite urmatoarea eroare:
Warning: PDO::query() [[Link]]: SQLSTATE[42S22]: Column not found:
1054 Unknown column 'zzz' in 'field list' in E:\server\www\[Link] on line
19
Warning: Invalid argument supplied for foreach() in
E:\server\www\[Link] on line 22
- Daca la setAttribute, in loc de ERRMODE_WARNING se adauga
ERRMODE_EXCEPTION, informatia afisata despre eroare va fi:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'zzz' in 'field
list'
2. beginTransaction
Metoda beginTransaction() se foloseste impreuna cu commit().
beginTransaction() opreste executia oricarei interogari la baza de
date, pana cand e apelata metoda commit(), in acel moment vor fi
executate declaratiile SQL adaugate intre aceste 2 metode.
Avantajul acestei tehnici consta in faptul ca pot fi scrise mai multe seturi
de interogari SQL, care "stau in asteptare", iar cand e apelata
metodacommit() sunt executate toate deodata.
In exemplu urmator se aplica beginTransaction() care permite scrierea
de instructiuni SQL fara ca acestea sa fie transmise la serverul MySQL. Se
adauga 3 comenzi: prima modifica datele din randul unde id=3 (cu
UPDATE), a doua (cu INSERT) adauga un nou rand, iar a treia comanda
efectueaza un SELECT, dar in functie de ultimul "id" creat prin INSERT-ul
precedent. Toate aceste instructiuni sunt executate cand e apelata
metoda commit() (vedeti si explicatiile din cod).
<?php
// Datele de conectare (adresa_server, baza_de_date, nume si parola)
$hostdb = 'localhost';
$namedb = 'teste';
$userdb = 'username';
$passdb = 'password';
try {
// Conectare si creare obiect PDO
$dbh = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Seteaza mod exception pt. erori
$dbh->exec("SET CHARACTER SET utf8");
$dbh->beginTransaction();
//
// Setare encoding caractere UTF-8
// Incepe inscrierea comenzilor
// 1. Modificare date din coloanele "nume" si "adresa", unde id=3
$dbh->exec("UPDATE `sites` SET `nume`='Cursuri Spaniola',
`adresa`='[Link]/spaniola' WHERE `id`=3");
// 2. Adaugare date in rand nou
$dbh->exec("INSERT INTO `sites` (`nume`, `categorie`, `adresa`) VALUES
('JavaScript', 'programare', '[Link]/javascript')");
$last_id = $dbh->lastInsertId();
// Retine ultimul id adaugat
// 3. Selectare date din randurile anterioare celui adaugat inainte ("id" mai mic
decat $last_id)
$datas = $dbh->query("SELECT `nume`, `adresa` FROM `sites` WHERE
`id`<'$last_id'");
$dbh->commit();
// Determina transmiterea tuturor comenzilor la MySQL
// Daca select-ul e facut cu succes ($datas nu e false)
if($datas !== false) {
echo 'Ultimul id adaugat: '. $last_id. '<br />';
(la comanda 2)
// Se parcurg si afiseaza datele selectate
foreach($datas as $row) {
echo $row['nume']. ' - '. $row['adresa']. '<br />';
}
}
$dbh = null;
// Deconectare
// Afiseaza ultimul id adaugat
}
catch(PDOException $e) {
echo $e->getMessage();
}
?>
- Dupa cum arata si exemplu, aceasta metoda este utila in cazul cand
trebuie efectuate mai multe interogari diferite la baza de date, in acelasi
script. In plus, imbunatateste si viteza de executie a scriptului, face mai
eficient lucru cu multiple interogari la baza de date. Intre comenzile SQL
care "sunt in asteptare" se pot adauga diferite instructiuni PHP care sa
influenteze urmatoarele comenzi (precum aici SELECT-ul a fost facut in
functie de ultimul "id" creat prin comanda precedenta).
- Dupa executie, scriptul afiseaza in browser urmatorul rezultat:
Ultimul id adaugat: 4
Cursuri - Tutoriale - [Link]
Curs PHP-MySQL - [Link]/php-mysql
Cursuri Spaniola - [Link]/spaniola
Daca atributul setAttribute() e setat pe modul ERRMODE_WARNING si apare vreo
eroare la una din declaratiile SQL dintre beginTransaction() si commit(), cand acestea
sunt transmise la server, celelalte comenzi dupa cea care a determinat eroarea nu mai
sunt executate.
Dar daca nu e specificat modul de eroare ERRMODE_WARNING, scriptul continua executia
si la celelalte comenzi.
PHP Functii Anonime - Closures
Incepand cu versiunea 5.3, PHP a introdus Functii Anonime, cunoscute
si cu denumirea Closures.
Acest tip de functii sunt fara nume. Sunt utile mai ales in retuenarea unor
valori la apeluri in cadrul altor functii.
1. Exemplu, functie anonima folosita pentru returnarea unei valori intr-o
functie PHP.
<?php
$arr = array(' hello word ', ' Have <b>good day</b>');
// sterge tag-urile si spatiile exterioare din fin fiecare element din array
// Face majuscula prima litera a fiecarui cuvant
$arr = array_map(function($elm){
return ucwords(trim(strip_tags($elm)));
}, $arr);
var_export($arr);
// array ( 0 => 'Hello Word', 1 => 'Have Good Day' )
?>
2. Closures pot fi utilizate si ca valori ale variabilelor (observati cum e
apelata functia, folosind numele variabilei, inclusiv caracterul $).
<?php
$website = function($name) {
return '[Link] $name. '.net';
};
echo $website('coursesweb');
echo $website('marplo');
// [Link]
// [Link]
?>
3. Closures pot fi create si in interiorul altor functii. In urmatorul exemplu
se foloseste closures pt creare liste HTML, <li>.
<?php
// primeste un array cu elementele ce vor forma liste <li>
function ulList($ar_items) {
$li = function($item) {
return '<li>'. $item. '</li>';
};
// parcurge array-ul din parametru, apeleaza $li() ca sa creeze <ul><li>
$ul = '<ul>';
foreach($ar_items as $item) {
$ul .= $li($item);
}
$ul .= '<ul>';
return $ul;
}
$ar_items = array('li 1', 'li 2', 'li 3');
echo ulList($ar_items);
// <ul><li>li 1</li><li>li 2</li><li>li 3</li><ul>
?>
- Un alt exemplu cu functie anonima in interiorul altei functii. Observati
utilizarea lui use() , pentru a putea folosi variabile din afara functiei
anonime in interiorul ei.
<?php
function test($a) {
$b = $a / 2;
$c = function($a) use($b) {
return $a + $b;
};
return $c($a);
}
echo test(10);
// 15
?>
4. Closures pot fi un instrument util si in programarea orientata pe
obiecte. Incepand cu PHP 5.4 , expresia $this poate fi utilizata in functii
anonime.
<?php
class A {
private $value = 1;
public function getVal() {
return function() { return $this->value * 2; };
}
}
$a = new A;
echo $a->getVal();
// 2
?>
Trimitere date la o adresa de e-mail
Part. 2
Invatati sa trimiteti mesaje si date dintr-un formular la o casuta de e-mail.
Este util sa avem pe o pagina din site un formular prin care vizitatorii sa
poata trimite mesaje la o adresa de e-mail.
Am putea lasa pe pagina doar adresa de e-mail la care vizitatorii sa ne
poata contacta, dar aceasta metoda (comoda pt. webmaster) nu este
indicata. In primul rand din cauza programelor bot care circula pe net si
colecteaza adresele de e-mail de pe site-uri pentru ca mai tarziu sa
transmita mail-uri spam. In al doilea rand este mai simplu si mai rapid
pentru vizitator sa trimita mesajul direct de pe site.
In cadrul acestei lectii este explicat un mod simplu de utilizare a
limbajului PHP pentru a expedia la o adresa de e-mail date sub forma de
text, preluate de la un formular HTML.
Pentru a putea expedia datele la adresa de mail, scripturile PHP trebuie
sa fie capabile de a obtine accesul la serviciile SMTP (Simple Mail
Transfer Protocol).
Daca folositi serviciile oferite de un "web hosting", majoritatea au
implementate aceste functii.
Daca folositi propriul sistem pentru gazduirea site-ului, sau pentru teste,
este nevoie sa aveti instalat si un server SMTP, acesta preia datele
prelucrate de modulul PHP si le trimite la adresa de e-mail.
Expedierea mesajelor de e-mail
Configuratia PHP standard accepta expedierea mesajelor de e-mail prin
intermediul SMTP (abreviere de la Simple Mail Transfer Protocol). Acesta
este protocolul standard folosit pentru transferul mesajelor de e-mail,
prin intermediul Internetului.
Mesajele de e-mail sunt alcatuite din doua parti: o serie de antete de
mesaj si un corp.
- Antetele de mesaj indica adresa destinatarului si subiectul mail-ului, precum
si alte informatii.
- Corpul contine mesajul in sine.
Pentru a trimite datele la o adresa de e-mail, se foloseste functia mail(),
care preia 3 argumente principale, avand urmatoarea forma:
mail($to, $subject, $message)
Unde, in ordinea argumentelor:
- primul argument, aici variabila "$to", va contine adresa de e-mail a
destinatarului (unde va fi trimis mesajul)
- al doilea argument, aici variabila "$subject", va contine subiect-ul mail-ului
- al treilea argument, aici variabila "$message" va contine mesajul
Functia "mail()" poate contine si alte adrese de e-mail optionale, astfel un
al patrulea argument poate fi "From", care indica adresa de e-mail a
expeditorului (cel care trimite mesajul).
Functia ar avea astfel urmatoarea forma:
mail($to, $subject, $message, $from )
- Variabila "$from" trebuie sa contina in sir cuvantul "From: " inaintea
adresei de e-mail, adica asa:
$from="From: adresa@[Link]";
- Daca argumentul "$from" nu este specificat, serverul va transmite
automat aceasta adresa (in functie de cum este configurat). Astfel, cand
primim mail-ul, pe langa subiect vom avea adresa expeditorului, si daca
nu este specificata, putem vedea ceva de genul "nobody@[Link]"
Datele pentru aceste argumente, in special al treilea (aici "$message"),
pot fi preluate dintr-un formular HTML, folosind functia "$_POST".
Functia "mail()" returneaza TRUE daca mail-ul a fost acceptat pentru
expediere, in caz contrar returneaza FALSE.
Iata un script PHP simplu care va trimite mesaje la o adresa de e-mail:
<?php
// Verifica daca au fost trimise datele de la formular
if (isset($_POST['email']) && isset($_POST['mesaj'])) {
$to = 'adresa_ta@[Link]';
// Adresa unde va fi trimis mesajul
$subiect = 'Mesaj de pe site';
$mesaj = $_POST['mesaj'];
$from = 'From: '. $_POST['email'];
// PHP trimite datele la serverul de e-mail
if (mail($to, $subiect, $mesaj, $from)) {
echo 'Mesajul a fost trimis cu succes.';
}
else {
echo 'Eroare, mesajul nu a putut fi expediat.';
}
}
?>
- Intai se verifica (cu isset()) daca au fost trimise date de la formularul
HTML. Fara aceasta verificare, s-ar expedia mesaje de e-mail ori de cate
ori cineva (intentionat) acceseaza direct fisierul php cu scriptul.
- Variabilele "$mesaj" si "$from" preiau datele adaugate de vizitator in
campurile unui formular HTML care au atributele 'name="mesaj"' si
'name="email"'.
Daca functia "mail()" este executata cu succes, va apare mesajul "Mesajul
a fost trimis cu succes.", in caz contrar va afisa "Eroare, mesajul nu a
putut fi expediat.".
Un model de cod HTML pentru crearea formularului care trimite datele la
scriptul php de mai sus este urmatoru:
<h3>Trimiteti mesaj</h3>
<form name="form" method="post" action="nume_script.php">
<label>E-mail : </label>
<input type="text" name="email" size="20" /> <br />
<label>Scrie mesajul : </label> <br />
<textarea name="mesaj" cols="35" rows="6"></textarea> <br />
<input type="submit" value="Trimite" />
</form>
- "nume_script.php" este calea si numele fisierului in care se afla scriptul
php de mai sus.
In browser va apare:
Trimiteti mesaj
E-mail :
Scrie mesajul :
Trimite
La sectiunea Mailer gasiti un "mailer" mai complet.
- In Partea 2 invatati cum sa trimiteti mail-uri cu PHP care pot cotine taguri HTML si cod CSS.
Part. 2
Creare imagini cu PHP
Invatati sa creati si sa afisati imagini cu PHP
Invatati sa afisati mai multe imagini generate de PHP in aceeasi pagina
Pe langa crearea de cod de tip text (HTML, XML, ...), PHP poate fi folosit
si pentru crearea si manipularea de imagini cu diferite formate (GIF,
PNG, JPEG, WBMP si XPM).
PHP are implemetat cateva functii pentru lucru cu informatii legate de
imagini, cum ar fi lungimea, latimea sau extensia imaginii. Pentru
crearea de noi imagini sau manipularea celor existente este necesar sa
aveti instalat in PHP o librarii GD cu functii pentru imagini. Pentru mai
multe informatii despre cerinte si instalare librarie GD, vizitati GD library.
- Daca folositi WampServer sau Xampp, acestea au deja incluse
librarii GD.
Puteti afla informatii despre libraria GD instalata folosind
functia gd_info(), aceasta returneaza o matrice cu informatii despre
libraria GD inclusa.
Exemplu:
<?php
var_dump(gd_info());
?>
1. Crearea imaginilor
Pentru crearea unei imagini cu PHP sunt esentiali urmatorii pasi:
- Definirea identificatorului de imagine si suprafata de baza a imaginii.
- Stabilirea culorilor fundalului, formei sau a textului din imagine.
- Trimiterea datelor de iesire cu imaginea creata.
- Eliberarea memoriei asociata creeri imaginii.
Cam asta e, pe scurt, partea teoretica, acum sa trecem la practica, voi
prezenta pas cu pas un script PHP simplu care va afisa in browser o
imagine PNG formata dintr-un dreptunghi cu fundal albastru si in interior
un text.
Scriptul este urmatorul:
<?php
$text = 'Textul din imagine';
// setare dimensiuni suprafetei de baza
$height = 40;
$width = 170;
// definirea imaginii
$im = imagecreate($width, $height);
// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$text_color = imagecolorallocate($im, 255, 255, 255);
// finalizarea imaginii
imagefill($im, 0, 0, $fundal);
imagestring($im, 4, 10, 15, $text, $text_color);
// trimiterea datelor de iesire
header('Content-type: image/png');
imagepng($im);
// curatarea memoriei
imagedestroy($im);
?>
- Acest script va afisa urmatorul rezultat
Sa studiem acest script
- Pentru inceput am setat variabila "$text" ce contine textul care va
fi adaugat in imagine, si variabilele "$height" si "$width" care reprezinta
dimensiunile imaginii.
- In continuare avem "$im = imagecreate($width, $height)",
functia imagecreate() returneaza un identificator de imagine ce creaza
suprafata de baza a imaginii, prelund ca argumente dimensiunile acesteia
(in pixeli).
- Ca alternativa se poate folosi o imagine deja existenta, peste care sa
adaugati testul, pentru aceasta se foloseste
functiaimagecreatefrompng("[Link]") (sau
"imagecreatefromjpeg()", "imagecreatefromgif()"; in functie de tipul
imaginii), exemplu: $im = imagecreatefrompng("[Link]")
- Urmatorul pas este definirea culorii pentru fundal si pentru text,
pentru aceasta se foloseste functia imagecolorallocate(), aceasta
returneaza un identificator de culoare care va fi folosit pentru accesarea
culorii si preia 4 argumente: primul argument este identificatorul de
imagine creat cu "imagecreate()" (in script este in variabila "$im"),
urmatoarele trei argumente reprezinta valorile RGB (Red, Green, Blue)
pentru stabilirea culorii.
- Pentru adaugarea culorii de fundal se foloseste functia imagefill(),
care preia 4 argumente (in script avem "imagefill($im, 0, 0, $fundal);"),
argumentele sunt:
- identificatorul de imagine
- urmatoarele doua argumente definesc coordonatele X si Y de start pentru
umplerea culorii (0, 0)
- ultimul argument reprezinta identificatorul de culoare folosit (aici cel din
variabila $fundal)
- Pentru adaugarea textului in cadrul imaginii se foloseste
functia imagestring(), aceasta preia 6 argumente:
1. - identificatorul de imagine
2. - tipul fondului folosit, care poate fi un numar intre 1 si 5, reprezentand
fonturi prestabilite
o - ca alternativa se poate folosi functia imageloadfont(), pentru
includerea de alte fonturi
3. - al treilea argument reprezinta distanta, in pixeli, fata de marginea din
stanga a imaginii
4. - al patrulea argument reprezinta distanta, in pixeli, fata de marginea de
sus a imaginii
5. - al cincilea argument reprezinta sirul introdus
6. - ultimul argument este culoarea textului
- Urmatotul pas este trimiterea datelor de iesire pentru afisarea in
browser.
- Pentru aceasta intai scriptul spune browser-ului ca trimite o imagine si nu
test sau HTML, se face acest lucru folosind functia header() cu tipul MIME
al imaginii "header('Content-type: image/png')". Daca doriti ca imaginea sa
fie de tip JPEG (sau GIF) inlocuiti "png" cu "jpeg" (sau "gif"), astfel 'Contenttype: image/jpeg'.
- dupa ce s-au trimis datele pentru "header", se trimit datele imaginii
utilizand functia imagepng() (sau "imagejpeg()", "imagegif(); in functie de
tipul imaginii") care preia ca argument identificatorul de imagine (in script
avem "imagepng($im)")
o Ca alternativa, imaginea poate fi scrisa intr-un fisier, in loc sa fie
afisata in browser o salvati pe server, pentru aceasta se adauga
un al doilea parametru la "imagepng()" reprezentand numele
fisierului, exemplu "imagepng($im, "[Link]")" si nu se mai
scrie functia "header()". (trebuie sa aveti permisiuni de scriere
pe server)
- In final s-a folosit functia imagedestroy() (care foloseste ca
argument identificatorul de imagine) pentru eliberarea resurselor de
memorie folosite la crearea imaginii.
2. Utilizarea imaginilor create cu PHP
Deoarece un header poate fi trimis numai o data pentru o pagina, si
asta este singura cale de a spune browser-ului ca sunt trimise date de
imagine, poate deveni mai dificil cand se doreste crearea si afisarea mai
multor imagini cu PHP.
In acest caz:
a) Puteti folosi scriptul pentru a salva imaginea pe server (dupa cum a
fost explicat mai sus) si apoi folositi etichete <img> pentru afisarea
imaginii
- Exemplu:
<?php
$text = 'Textul din imagine';
// setare dimensiuni
$height = 50;
$width = 170;
$im = imagecreate($width, $height);
// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$text_color = imagecolorallocate($im, 255, 255, 255);
// finalizarea imaginii
imagestring($im, 4, 10, 15, $text, $text_color);
// salvarea imaginii pe server
imagepng($im, "[Link]");
// curatarea memoriei
imagedestroy($im);
?>
<img src="[Link]" alt="Afisare 1" />
--- <img src="[Link]" alt="Afisare 2" />
- Acest script va afisa urmatorul rezultat
--b) O alta metoda este scrierea intr-un fisier php extern a scriptului care
genereaza si afiseaza imaginea, apoi apelati scriptul PHP in atributul src,
ca in exemplul urmator:
<img src="script_img.php" alt="Afisare 1" />
--- <img src="script_img.php" alt="Afisare 2" />
- Unde "script_img.php" este fisierul PHP care genereaza si afiseaza
imaginea
- In urmatoarea lectie, Lectia 33, sunt prezentate mai multe
functii utile in lucrul cu imagini generate de PHP.
Functii utile pentru lucrul cu imagini
Invatati si exersati diferite functii pentru crearea si manipularea imaginilor
Invatati sa copiati si sa redimensionati suprafete din imagini
In aceasta lectie sunt prezentate, cu exemple, cateva functii utile
pentru lucrul cu imagini generate de PHP.
1. Functia imageline()
- Aceasta functie deseneaza o linie in cadrul imaginii, sintaxa generala
este urmatoarea:
imageline("identificator_im", "x1", "y1", "x2", "y2", "id_culoare")
Unde
- "identificator_im" reprezinta identificatorul de imagine returnat de o functie
pentru crearea imaginii, cum e "imagecreate", "imagecreatetruecolor" sau
"imagecreatefrompng" (pt. imagine PNG)
- "x1" si "y1" reprezinta coordonatele de start (x, y) pentru punctul de
incepere a liniei (in pixeli, in raport cu marginea din stanga si de sus)
- "x2" si "y2" reprezinta coordonatele de final (x, y) pentru punctul de
terminare a liniei (in pixeli, in raport cu marginea din stanga si de sus)
- "id_culoare" reprezinta identificatorul de culoare folosit pentru culoarea liniei
(returnat de functia "imagecolorallocate")
Iata un exemplu:
<?php
// setare dimensiuni
$height = 40;
$width = 170;
// definirea cadrului de baza a imaginii
$im = imagecreate($width, $height);
// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$line_color = imagecolorallocate($im, 200, 220, 8);
// crearea imaginii
imagefill($im, 0, 0, $fundal);
imageline($im, 50, 10, 120, 10, $line_color);
imageline($im, 40, 20, 130, 20, $line_color);
// prima linie
// a doua linie
// trimiterea datelor de iesire
header('Content-type: image/jpeg');
imagejpeg($im);
// curatarea memoriei
imagedestroy($im);
?>
- Comentariile necesare sunt deja in codul scriptului.
- Functia "imageline()", folosita de 2 ori, va crea doua linii dupa
coordonatele dintre paranteze.
- Rezultatul accestui script este imaginea de mai jos
2. Functia imagearc()
- Aceasta functie deseneaza un arc de cerc centrat pe anumite
coordonate date. Sintaxa generala este urmatoarea:
imagearc("identificator_im", "x1", "y1", "width", "height", "start",
"end", "id_culoare")
Unde
- "identificator_im" reprezinta identificatorul de imagine returnat de o functie
pentru crearea imaginii, cum e "imagecreate", "imagecreatetruecolor" sau
"imagecreatefrompng" (pt. imagine PNG)
- "x1" si "y1" reprezinta coordonatele de start (x, y) pentru centrul arcului de
cerc (in pixeli, in raport cu marginea din stanga si de sus)
- "width" si "height" reprezinta lungimea, respectiv inaltimea, arcului de cerc.
- "start" reprezinta unghiul de inceput al arcului de cerc, in grade
- "end" reprezinta unghiul de sfarsit al arcului de cerc, in grade. 0 o este
localizat la pozitia orei 3, arcul de cerc fiind desenat in sensul acelor
ceasornicului.
- "id_culoare" reprezinta identificatorul de culoare folosit pentru culoarea liniei
arcului de cerc (returnat de functia "imagecolorallocate")
Iata un exemplu:
<?php
// setare dimensiuni
$height = 100;
$width = 100;
// definirea imaginii
$im = imagecreate($width, $height);
// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$cerc_color = imagecolorallocate($im, 220, 220, 8);
$arc_color = imagecolorallocate($im, 250, 2, 2);
// crearea imaginii
imagefill($im, 0, 0, $fundal);
imagearc($im, 30, 25, 20, 20, 0, 360, $cerc_color);
imagearc($im, 70, 25, 20, 20, 0, 360, $cerc_color);
imagearc($im, 50, 44, 70, 70, 25, 150, $arc_color);
// primul cerc
// al doilea cerc
// ultimul arc de cerc
// trimiterea datelor de iesire
header('Content-type: image/jpeg');
imagejpeg($im);
// curatarea memoriei
imagedestroy($im);
?>
- Comentariile necesare sunt deja in codul scriptului.
- Functia "imagearc()", folosita de 3 ori, va crea arce de cerc dupa
coordonatele dintre paranteze. (Testati singuri scriptul, modificand
valorile argumentelor)
- Rezultatul accestui script este imaginea de mai jos
- Observati ca pot fi create cercuri complete sau arce de cerc, in functie
de valoarea in grade a argumentului sapte ("end").
- Pentru a desena un arc de cerc (sau cerc) cu suprafata colorata,
nu doar linia de margine, folositi functia "imagefilledarc()".
3. Functia getimagesize()
- Aceasta functie returneaza o matrice cu mai multe elemente ce contin
date despre tipul si dimensiunile imagini.
Mai importante sunt primele 2 elemente din matrice (index 0 si 1) care
reprezinta lungimea, respectiv inaltimea imaginii; si al patrulea element
(index 3) care este un sir cu dimensiunile imaginii.
Iata un exemplu:
<?php
$img = 'imagini/[Link]';
// calea catre fisierul cu imaginea
$size = getimagesize($img);
echo "$size[0] - $size[1] <br /> $size[3]";
?>
- "getimagesize()" preia ca argument imaginea si stocheaza datele
(matricea) in variabila "$size".
- acest script va afisa un rezultat similar cu cel de mai jos (depinde de
imaginea folosita)
270 - 100
width="270" height="100"
4. Functia imagecopy()
- Aceasta functie copie o portiune dintr-o imagine data. Sintaxa
generala este urmatoarea:
imagecopy("identificator_im2", "identificator_im1", "x2", "y2", "x1",
"y1", "width", "height")
Unde
- "identificator_im2" reprezinta identificatorul celei dea doua imagini,
rezultata prin suprafata copiata
- "identificator_im1" reprezinta identificatorul primei imagini (sursa), din care
va fi copiata portiunea
- "x2" si "y2" reprezinta coordonatele de start (x, y) din cadrul celei dea doua
imagini, punctul de unde va incepe adaugarea imaginii rezultata prin
suprafata copiata
- "x1" si "y1" reprezinta coordonatele de start (x, y) din prima imagine, de
unde va incepe copierea (in pixeli, in raport cu marginea din stanga si de
sus)
- "width" si "height" reprezinta lungimea, respectiv inaltimea, suprafetei
copiate.
Iata un exemplu:
- Avem initial aceasta imagine
- In continuare urmatorul script va copia si afisa o portiune din imagine
<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng('imgs/[Link]');
// definirea identificatorului si a cadrului pt. imaginea 2
// care va rezulta cu suprafata copiata
$im2 = imagecreatetruecolor(170, 50);
// Copierea suprafetei
imagecopy($im2, $im1, 10, 0, 30, 10, 170, 50);
// datele de iesire
header('Content-Type: image/png');
imagepng($im2);
// eliberarea memoriei
imagedestroy($im2);
imagedestroy($im1);
?>
- "imagecopy()" va copia o suprafata din prima imagine, reprezentata prin
"$im1" si o va incadra in cea dea doua imagine, reprezentata prin "$im2"
(conform coordonatelor date).
- Acest script va returna urmatorul rezultat:
5. Functia imagecopyresized()
- Aceasta functie copie si redimensioneaza o portiune dintr-o imagine
data. Sintaxa generala este urmatoarea:
imagecopyresized("identificator_im2", "identificator_im1", "x2", "y2",
"x1", "y1", "width2", "height2", "width1", "height1")
Unde
- "identificator_im2" reprezinta identificatorul celei dea doua imagini,
rezultata cu suprafata copiata si redimensionata
- "identificator_im1" reprezinta identificatorul primei imagini (sursa), din care
va fi copiata portiunea
- "x2" si "y2" reprezinta coordonatele de start (x, y) din cadrul celei dea doua
imagini, punctul de unde va incepe adaugarea imaginii rezultata prin
suprafata copiata si redimensionata
- "x1" si "y1" reprezinta coordonatele de start (x, y) din prima imagine, de
unde va incepe copierea suprafetei (in pixeli, in raport cu marginea din
stanga si de sus)
- "width2" si "height2" reprezinta lungimea, respectiv inaltimea, suprafetei
rezultata dupa redimensionare.
- "width1" si "height1" reprezinta lungimea, respectiv inaltimea, suprafetei
copiate.
Iata un exemplu:
- Avem initial aceasta imagine
- In continuare urmatorul script va copia, redimensiona si afisa o portiune din
imagine
<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng('imgs/[Link]');
// definirea identificatorului si a cadrului pt. imaginea 2
// care va rezulta cu suprafata copiata si redimensionata
$im2 = imagecreatetruecolor(80, 20);
// Copierea si redimensionarea suprafetei
imagecopyresized($im2, $im1, 0, 0, 10, 10, 80, 20, 170, 50);
// datele de iesire
header('Content-Type: image/png');
imagepng($im2);
// eliberarea memoriei
imagedestroy($im2);
imagedestroy($im1);
?>
- "imagecopyresized()" va copia o suprafata din prima imagine =,
reprezentata prin "$im1" si o va redimensiona si incadra in cea dea doua
imagine, reprezentata prin "$im2" (conform coordonatelor date).
- Acest script va returna urmatorul rezultat:
- Pentru copierea si redimensionarea imaginii cu "resambling", puteti
folosi functia imagecopyresampled().
O lista completa cu functiile care pot fi folosite pentru lucrul cu imagini in PHP gasiti
aici Functii pentru imagini
Creare PDF cu PHP
Part. 2
In aceasta lectie veti invata cum sa creati documente PDF cu PHP
Pe langa date de tip text sau imagini, cu PHP puteti crea si documente
in format PDF (care pot fi citite cu Adobe Acrobat Reader), utile in special
cand se doreste scoaterea la imprimanta a paginilor.
Pentru crearea documentelor de tip PDF pot fi utilizate functii care
folosesc libraria PDFlib. Pentru a folosi functiile specifice acestei librarii
trebuie sa aveti PDFlib instalat si activat in modulul PHP. Incepand cu
versiunea PHP 5 si PDFlib 6 functiile acesteia sunt apelate ca metodele
unei clase. Pe langa faptul ca unele sisteme nu au instalata sau activata
aceasta librarie de functii, trebuie sa tineti cont la scrierea programului
si de versiunile PHP si PDFlib pe care le folositi, acest lucru poate fi mai
dificil pentru incepatori. Totusi, daca sunteti interesati gasiti
documentatia pentru crearea documentelor PDF cu PDFlib la
pagina creare PDF cu PHP si PDFlib.
O alta modalitate mai simpla de a crea documente PDF cu PHP este
folosirea unei clase numite FDPF. Avantajul este ca aceasta clasa nu
necesita instalarea PDFlib si este gratuita. Aveti nevoie doar de fisierul
PHP care contine clasa FPDF si un director cu fonturile pe care le puteti
folosi in documentul PDF, acestea le puteti descarca de aici Download
Clasa FPDF sau de pe site-ul oficial [Link].
Documentatia si tutorialele in limba engleza le puteti descarca si de aici
-> Documentatie Clasa FPDF.
Aceasta lectie are doua parti, in prima parte, aici, voi explica lucrile de
baza (pentru incepatori) in crearea documente PDF folosind class FPDF,
iar in partea a doua sunt prezentate cateva metode mai avansate.
1. Primul document PDF
Primul pas e sa copiati pe server fisierul PHP cu clasa FPDF si directorul
cu fonturile, apoi in fisierul dv. php includeti aceasta clasa dupa care
urmeaza datele necesare creari documentului PDF.
Aceste date trebuie sa fie in principal urmatoarele:
1. Se creaza obiectul ce va reprezenta documentul PDF. Pentru aceasta se
foloseste expresia new FPDF(), aceasta poate prelua 3 argumente,
exemplu:new FPDF('P','mm','A4'); primul argument defineste orientarea
paginii (P - Portrait sau L - Landscape), al doilea argument e pentru unitatea
de masura (mm - milimetri, cm - centimetri, pt - point), iar ultimul
argument este pt. formatul paginii (A3, A4, A5, Letter). Daca nu sunt
specificate argumente, documentul va avea valorile implicite: Portrait,
milimetri, A4.
2. Se adauga elemente ce definesc fontul, grafica, textul, imagini si altele.
Pentru aceasta se folosesc metodele (functiile) clasei FPDF.
- Aici, inainte de a adauga text, apelati metoda pentru
initializarea paginii, functia AddPage(), si metoda pentru definirea
fontuluiSetFont().
3. La urma se trimit datele de iesire cu metoda Output(), aceasta poate
prelua 2 argumente, avand forma generala.
Output('file', 'action')
- unde 'file' este numele documentului PDF creat, exemplu
'[Link]'
- iar 'action' poate fi unul din literele: 'I', 'D', 'F' sau 'S' care
reprezinta actiunea ce se va efectua
- I trimite fisierul pdf sa fie afisat in browser
- D deschide optiunea de download a documentului PDF
- F salveaza fisierul pdf pe server, cu numele (si calea)
adaugat in primul atribut
- S returneaza documentul ca string (sir), numele este
ignorat.
Daca metoda Output() este apelata fara atribute, documentul PDF va fi
afisat direct in browser.
Pentru ca documentul PDF creat sa poata fi vizualizat de browser sau
descarcat, browser-ul clientului trebuie sa aibe instalat plug-in-ul pentru
Adobe Reader.
Cand continutul pe care doriti sa-l afisati in pagina PDF depsaseste
inaltimea acesteia, se va genera automat o pagina noua.
Iata un exemplu simplu in care este creata o pagina PDF si in ea un text.
<?php
include('[Link]');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Text(25,40,'Prima pagina PDF.');
$pdf->Output();
?>
- Dupa includerea fisierului cu clasa FPDF '[Link]' am definit obiectul
FPDF() stocat in variabila "$pdf", cu aceasta se va apela metodele clasei.
- Odata obiectul creat, am initializat crearea paginii cu "$pdf-
>AddPage()", apoi am setat fontul apeland metoda specifica "$pdf>SetFont('Arial','B',16)" - primul argument este numele fontului, al doilea
este pentru stil (B-bold, I-italic, U-underline, null-normal).
- In continuare am apelat metoda Text() pentru crearea textului, aceasta
preia 3 argumente: primul argument reprezinta distanta X fata de
marginea din stanga (aici 25), al doilea argument reprezinta distanta Y
fata de marginea de sus (aici 40) si ultimul este textul care va apare in
pagina PDF.
- Dupa ce am definit toate aceste elemente, apelam metoda Output(),
fara atribute, care trimite datele de iesire pentru afisarea documentului
PDF.
- Daca doriti salvarea acestuia pe server, apelati aceasta metoda astfel
$pdf->Output('[Link]', 'F'); (in acest caz, PHP trebuie sa aibe
permisiuni de creare fisiere pe server). Daca doriti ca utilizatorului sa-i
apara optiunea de download, apelati aceasta metoda asa: $pdf>Output('[Link]', 'D'); (fisierul nu va fi salvat si pe server).
- Puteti vedea rezultatele acestui exemplu aici -> Demo 1.
In documentatia FPDF gasiti metodele pe care aceasta clasa le poate
folosi, rolul lor si argumentele pe care le preia fiecare.
2. Adaugarea unei celule cu text
Pe langa text simplu, puteti adauga si celule (cadre) in care sa fie
adaugat textul. Aceste celule le puteti crea cu metoda Cell(); sunt
similare cu DIV-ul din HTML, le putem defini suprafata, fondul, bordura
sau alinierea datelor.
Iata un exemplu care va crea o pagina PDF in care avem o celula cu un
text centrat in ea.
<?php
include('[Link]');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Cell(36,10,'Text in celula.',1,1,'C');
$pdf->Output();
?>
- Ca si in primul exemplu, dupa ce am inclus fisierul cu clasa FPDF am
definit obiectul de lucru si am setat initializarea paginii si fontul.
- Functia cell() defineste cadrul celulei si textul din ea, aceasta preia mai
multe argumente:
- primele doua reprezinta lungimea si inaltimea celulei
- urmatorul argument este textul afisat in celula
- celelalte argumente sunt pentru bordura, pozitia pointer-ului in pagina in
raport cu celula si alinierea textului din ea
- in afara de acestea, functia cell() mai poate prelua 2 argumente: pentru
fundal (true) si pentru link.
- La urma am apelat metoda Output() care trimite datele de iesire pentru
afisare.
Rezultatul acestui exemplu il puteti vedea aici -> Demo 2.
3. Linie noua, culori si fond
In urmatorul exemplu puteti vedea cum sa adaugati o linie noua in
pagina, sa setati o culoare pentru text si pt. fondul unei celule si sa
definiti culoarea si grosimea bordurii celulei.
Pentru a adauga o linie noua intr-o pagina PDF construita cu clasa FPDF
se apeleaza metoda Ln(), aceasta poate prelua un argument numeric ce
reprezinta inaltimea noii linii.
Pentru definirea unei culori pentru text se foloseste
metoda SetTextColor(), aceasta preia 3 argumente numerice cu
valoarea intre 0 si 255 reprezentand culorile RGB (Red, Green, Blue).
Similar, pentru culoarea de fundal (background) se foloseste
metoda SetFillColor() cu cele 3 argumente reprezentand culorile RGB,
iar pentru culoarea bordurii se foloseste metoda SetDrawColor().
Grosimea liniei se poate defini cu metoda SetLineWidth(nr), unde "nr"
e un numar ce reprezinta grosimea in unitatea de masura data, de obicei
milimetri. Daca aceasta metoda nu e specificata, grosimea liniei este 0.2
mm.
Iata un exemplu care va crea o pagina PDF cu 2 linii de text (a doua cu
text albastru) si o alta linie in care avem o celula cu fond galben, bordura
definita si text verde.
<?php
include('[Link]');
// Include clasa FPDF
// Creaza documentul de lucru
$pdf=new FPDF();
$pdf->AddPage();
// Initializeaza pagina
$pdf->SetFont('Arial','',16);
$pdf->Text(20,10,"Prima linie");
// Adauga prima linie de text
$pdf->SetTextColor(1,1,250);
// Seteaza culoarea pentru textul care va apare in
continuare
$pdf->Text(20,16,"Alta linie de text");
// Adauga o alta linie cu text albastru
$pdf->ln(10);
// Adauga rand nou cu inaltimea 10 mm
$pdf->SetDrawColor(0,10,220);
// Seteaza o culoare pt. bordura celulei
$pdf->SetLineWidth(0.5);
// Defineste grosimea bordurii la jumatate de
milimetru
$pdf->SetFillColor(255,255,10);
//Seteaza culoarea pt. background din
celula urmatoare
$pdf->SetTextColor(0,220,0);
// Schimba culoarea pentru urmatorul text
$pdf->Cell(115,10,'A treia linie de text in celula, dupa linie noua',1,1,'C',true);
//
Celula cu background
$pdf->Output();
?>
// Trimite datele de iesire la browser
- Ca sa intelegeti rolul fiecarei linii de cod, cititi comentariile asociate.
Pentru a vedea rezultatul acestui script click aici -> Demo 3.
- Ca sa observati mai bine rolul liniei noi "Ln()", cand testati scriptul,
stergeti aceasta linie de cod.
4. Paragraf, Linie, Imagine si Link
Paragraf
In exemplele de sus ati vazut cum puteti adauga text (pe o linie) folosind
metoda "Text()", totusi, aceasta metoda este utila in cazul sirurilor mai
mici, pe o singura linie, dar sunt situatii cand trebuie sa adaugati in
pagina PDF un continut de text mai mare si care are mai multe linii. In
acest caz folositi metoda write(), aceasta permite adaugarea de
continut text cu mai multe linii (formate cu "\n") sau cand testul ajunge
la marginea din dreapta trece automat pe o noua linie. Sintaxa generala
a acestei metode este:
Write(h, continut_text, url)
- unde "h" este inalimea fiecarei linii din paragraf, "continut_text" este
textul adaugat, iar "url" (optional) este o adresa URL care poate fi
deschisa cand se da click pe continut_text.
Linie
Clasa FPDF are si o metoda pe care o puteti folosi pentru trasarea de linii
in pagina, aceasta este metoda line() si are urmatoarea sintaxa:
Line(x1, y1, x2, y2)
- unde "x1" si "y1" sunt coordonatele X si Y pentru punctul de inceput a
liniei, iar "x2" si "y2" sunt coordonatele X si Y pentru punctul de sfarsit a
liniei
Imagine
Pe langa date de tip text sau linii, in pagiina PDF puteti adauga cu FPDF
si imagini JPEG, PNG sau GIF; pentru aceasta se foloseste
metoda Image() care are urmatoarea sintaxa:
Image(src, x, y, w, h, tip, url)
- unde "src" este adresa imaginii, aceasta este singura strict necesara,
restul sunt optionale.
- "x" si "y" sunt coordonatele X si Y pentru coltul din stanga-sus de unde
incepe afisarea imaginii, daca nu sunt specificate se folosesc
coordonatele curente.
- "w" si "h" reprezinta dimensiunile (lungime, inaltime) in care va fi
afisata imaginea in pagina, daca nu sunt specificate se folosesc
dimensiunile imaginii.
- "tip" este tipul imaginii (JPG, JPEG, PNG sau GIF), daca nu e adaugat se
preia din extensia acesteia, iar "url" este o adresa URL care poate fi
deschisa la click pe imaginea respectiva.
Link
Sunt mai multe metode, simple sau mai complexe, de a adauga un link
in pagina PDF. Aici veti vedea doua metode simple, pentru ceva mai
complicat studiati tutorialul din documentatia FPDF.
Cea mai simpla metoda e sa scrieti direct adresa URL in continutul
textului (vedeti in exemplul de jos), in pagina va apare adresa asa cum
ati scris-o iar cand se da click pe ea deschide acea adresa.
O alta metoda pe care o puteti folosi e sa adaugati adresa in atributul
URL a uneia din metodele: Cell(), Write() sau Image().
Codul din urmatorul exemplu va afisa o pagina PDF in care este un
continut text pe mai multe linii care are si o adresa URL, urmat de un link
intr-o celula, doua linii si o imagine.
<?php
include('[Link]');
// Include clasa FPDF
// Creaza documentul de lucru
$pdf=new FPDF();
// Initializeaza pagina si defineste fontul textului
$pdf->AddPage();
$pdf->SetFont('Arial','',15);
// Sirul ce contine textul cu mai multe linii, care va fi adaugat in metoda Write()
$sir ="Text adaugat cu metoda Write() \r\n Linie noua din cadrul aceluiasi sir, \r\n O alta
linie care contine si un link [Link]/php-mysql";
$pdf->Write(5, $sir);
// Paragraf cu inaltimea liniei de 5 mm
$pdf->SetTextColor(1,1,250);
// Seteaza culoarea pentru textul care va apare in
continuare
$pdf->Ln(10);
// Linie noua cu inaltimea 20mm
$pdf->SetFont('Arial','I',13);
// Modifica stilul si dimensunea textului, pt.
evidentiere link
$pdf->Cell(23,5,'Link Jocuri','B',1,'C',false,'[Link]
// Celula
cu link si bordura jos pt. evidentierea acestuia
$pdf->Ln();
$pdf->Image('[Link]');
// Linie noua
// Adauga o imagine in pagina
// Adaugarea liniilor
$pdf->SetDrawColor(90,100,200);
$pdf->SetLineWidth(1);
$pdf->line(80,70,100,45);
$pdf->line(100,45,120,70);
$pdf->Output();
?>
// Seteaza culoarea pt. linie
// Defineste grosimea liniei
// Deseneaza prima linie
// Deseneaza a doua linie
// Trimite datele de iesire la browser
- Studiati codul si comentariile din script ca sa intelegeti modul de lucru.
Pentru a vedea rezultatul acestui script click aici -> Demo 4.
Atentie, cand doriti sa adaugati in metode atribute care, in ordine, sunt dupa altele
optionale pe care nu doriti sa le folositi, trebuie totusi sa le adaugati si pe acestea (cu
valoare nula "" saufalse).
De exempu, in scriptul de mai sus am vrut sa adaug o adresa URL in metoda "Cell()", care
este ultimul atribut, inaintea acestuia fiind atributul pt. background. Desi nu am folosit o
culoare pt. background, am adaugat acest atribut ca "false" ca sa fie respectata ordinea
atributelor recunoscute de clasa.
In partea a doua a acestei lectii veti invata cum sa adaugati elemente mai
avansate in documentul PDF, cum sunt: Header, nr. pagini, tabele sau
contint realizat prin recunoasterea unor tag-uri HTML.
Part. 2
Utilizare FTP cu PHP
Invatati sa va conectati la server prin FTP folosind PHP
Invatati sa transferati fisiere prin FTP cu PHP
Functii utile pentru utilizare FTP cu PHP
FTP (File Transfer Protocol) este un protocol standard care realizeaza o
conexiune client-server pentru transfer si manipulare de fisiere prin
Internet.
Cu ajutorul FTP puteti adauga si copia fisiere (si directoare) de pe server
sau sa le schimbati permisiunile CHMOD. PHP are functii speciale pentru
conectarea la server si lucrul cu FTP.
1. Conectarea la server
Pentru conectarea la server prin FTP sunt necesare 3 date
importante: adresa serverului (a domeniului), numele de
utilizator si parola de conectare prin FTP.
La inceput se deschide o conexiune cu serverul, folosind
functia ftp_connect(), aceasta preia ca argument necesar numele
serverului, care de obicei are forma "[Link]" ("server" poate fi
numele domeniului sau adresa IP a acestuia). Daca deschiderea
conexiunii s-a efectuat, functia va returna un ID a conexiunii, in caz
contrar returneaza FALSE.
Dupa deschiderea conexiunii se face autentificarea pe server, pentru
aceasta se foloseste functia ftp_login() care are urmatoarea sintaxa:
ftp_login(conn_id, nume_user, parola)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "nume_user" este numele de utilizator pentru conectare la FTP, iar
"parola" este parola utilizatorului.
Pentru inchiderea conectarii se foloseste functia ftp_close(), aceasta
preia ca argument id-ul conexiunii.
Iata un exemplu de conectare prin FTP la server-ul unui site:
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.un_site.net';
'[Link]'
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Poate fi de exemplu
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server);
// Executa autentificarea pe server (mod pasiv ca sa nu fie blocat de
firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
echo "Conectare reusita la serverul $ftp_server, pentru utilizatorul
$ftp_user";
}
// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca s-a efectuat cu succes conectarea si autentificarea pe server, va
afisa mesajul de confirmare, in caz contrar apare mesajul de eroare.
- La urma, "ftp_close($conn_id);" inchide conexiunea si elibereaza
memoria alocata.
Conectarea la server folosind codul de mai sus este primul pas, dupa
aceasta puteti folosi functiile PHP specifice FTP pentru a efectua diferite
operatii, cum sunt: preluarea continutului directoarelor, incarcarea sau
descarcarea de fisiere, crearea de noi directoare sau modificarea
permisiunilor CHMOD.
2. Preluarea continutului directoarelor
Pentru a prelua continutul unui director (numele fisierelor si
directoarelor din el) se foloseste functia
ftp_nlist(conn_id, director)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "director" este numele directorului a carui continut va fi preluat
Aceasta functie returneaza o matrice secventiala a carei elemente sunt
numele fiecarui director si fisier din catalogul cautat.
Mai jos este un exemplu practic.
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
'[Link]'
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Poate fi de exemplu
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server);
// Executa conectare pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
// Obtine continutul directorului (numele de fisiere si directoare din el)
$continut = ftp_nlist($conn_id, ".");
// Parcurge matricea si afiseaza numele directoarelor si fisierelor returnate
for ($i=0; $i<count($continut); $i++) {
echo '<br>'.$continut[$i];
}
}
// Inchide conexiunea
ftp_close($conn_id);
?>
- Dupa setarea conexiunii si autentificarea pe server, daca conectarea a
reusit este apelata functia "ftp_nlist()", care va stoca in variabila
"$continut" matricea cu numele cataloagelor si fisierelor din directorul
radacina (precizat de argumentul ".").
Daca doriti obtinerea datelor din alt director, de exemplu "www", puteti
apela functia asa: ftp_nlist($conn_id, '/www').
- Pentru afisarea (sau preluarea) numelui fiecarui fisier si director returnat
se parcurge matricea "$continut".
Rezultatul afisat de acest script va fi ceva similar cu cel de jos:
cgi-bin
private
public_html
statistics
www
3. Incarcare fi sier pe server
Pentru incarcarea (upload) unui fisier pe server prin FTP cu PHP se
foloseste functia ftp_put(), aceasta returneaza TRUE daca incarcarea sa efectuat cu succes, in caz contrar returneaza FALSE. Are urmatoarea
sintaxa:
ftp_put(conn_id, destinatie, fisier, tip_transfer)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "destinatie" este directorul (si numele fisierului) pe server unde va fi
incarcat fisierul
- "fisier" este numele fisierului care va fi copiat
- "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua
valoarea FTP_ASCII sau FTP_BINARY
Iata un exemplu in care se copie un fisier de pe calculatorul client pe
server, in directorul 'www':
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server);
// Executa conectare pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
// Datele cu numele fisierului, sursa unde se afla si directorul unde va fi
incarcat pe server
$fisier = '[Link]';
$sursa = 'c:/wamp/www/site/'. $fisier;
$destinatie = '/www/'. $fisier;
// Apeleaza functia "ftp_put()" pt. efectuarea transferului
// Afiseaza mesaj de reusita sau nu
if (ftp_put($conn_id, $destinatie, $sursa, FTP_BINARY)) echo "Fisierul $fisier
a fost incarcat pe server";
else echo "Eroare, fisierul $fisier nu a putut fi incarcat pe server";
}
// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si PHP are permisiuni de
transfer prin FTP, fisierul "[Link]" (aflat pe calculatorul client in directorul
"c:/wamp/www/site/") va fi copiat pe server, in directorul "www/".
- Fisierul va fi incarcat cu acelasi nume, daca doriti sa fie transferat pe
server cu alt nume, modificati la "$destinatie".
4. Copiere fi sier de pe server
Pentru copierea (download) unui fisier de pe server pe calculatorul
client se foloseste functia ftp_get(), aceasta returneaza TRUE daca
transferul s-a efectuat cu succes, in caz contrar returneaza FALSE. Are
urmatoarea sintaxa:
ftp_get(conn_id, client, fisier, tip_transfer)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "client" este locatia de pe calculatorul client unde va fi copiat fisierul
- "fisier" este numele fisierului (si locatia) de pe server unde acesta se
gaseste
- "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua
valoarea FTP_ASCII sau FTP_BINARY
Iata un exemplu in care se descarca prin FTP un fisier de pe server pe
calculatorul client:
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server);
// Executa conectare pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
// Datele cu numele fisierului, sursa unde se afla si directorul unde va fi
copiat
$fisier = '[Link]';
$server = '/www/'. $fisier;
$client = 'c:/download/'. $fisier;
// Apeleaza functia "ftp_get()" pt. efectuarea transferului
// Afiseaza mesaj de reusita sau nu
if (ftp_get($conn_id, $client, $server, FTP_BINARY)) echo "Fisierul $fisier a
fost descarcat";
else echo "Eroare, fisierul $fisier nu a putut fi descarcat";
}
// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si PHP are permisiuni de
transfer prin FTP, fisierul "[Link]" (aflat pe server in directorul "www/")
va fi copiat pe calculatorul client, in directorul "c:/download/".
- Fisierul va fi copiatat cu acelasi nume, daca doriti sa fie descarcat pe
calculator cu alt nume, modificati la "$client". Daca in directorul unde va
fi copiat se mai afla un fisier cu acelasi nume, acesta va fi inlocuit cu cel
descarcat de pe server.
5. Creare director pe server
Inainte de a crea un director nou prin FTP, setati directorul curent de
lucru care reprezinta locatia unde doriti sa fie creat noul catalog. Pentru
aceasta se foloseste functia ftp_chdir(conn_id, director); "conn_id"
este id-ul conexiunii iar "director" este numele directorului care va fi
setat pentru lucru.
Pentru crearea unui director pe server prin FTP se foloseste
functia ftp_mkdir(), in caz de succes returneaza numele noului director
creat, iar in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
ftp_mkdir(conn_id, nume_dir)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "nume_dir" este numele noului director
Iata un exemplu in care se creaza un director "test" pe server, in "www/":
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server);
// Executa conectare (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
$dir = 'un_director';
// Numele noului director
// Daca e setat directorul de lucru "www/"
if(ftp_chdir($conn_id, '/www/')) {
// Apeleaza functia "ftp_mkdir()" pt. crearea directorului
// Afiseaza mesaj de reusita sau nu
if (ftp_mkdir($conn_id, $dir)) echo "Directorul $dir a fost creat";
else echo "Eroare, directorul $dir nu a putut fi creat";
}
}
// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si directorul curent de lucru
(www/) este setat cu succes iar PHP are permisiuni de scriere pe server, in
catalogul "www/" va fi creat directorul "un_director".
Pentru stergerea unui director se foloseste functia ftp_rmdir(conn_id,
del_dir), unde "conn_id" este id-ul conexiunii iar "del_dir" este numele
directorului care va fi sters.
6. Transferarea unei portiuni de fi sier pe server
Pe langa transferul unui fisier complet, PHP ofera si functii pentru
transferul unei anumite parti din continutul unui fisier.
O functie care face acest lucru este ftp_fput(), aceasta incarca pe
server continut dintr-un fisier deschis cu "fopen()", returneaza TRUE in
caz de succes, iar in caz contrar returneaza FALSE. Are urmatoarea
sintaxa:
ftp_fput(conn_id, destinatie, pointer_fisier, tip_transfer)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "destinatie" este directorul de pe server unde va fi incarcat fisierul
- "pointer_fisier" reprezinta identificatorul (pointer-ul) de fisier deschis
cu "fopen()". Retine continutul de la acest pointer pana la sfarsitul
fisierului.
- "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua
valoarea FTP_ASCII sau FTP_BINARY
Iata un exemplu in care este preluata o parte din continutul unui fisier si
transferata intr-un fisier pe server:
<?php
$fisier = "[Link]";
// Fisierul care va fi deschis pt. citire
// Daca fisierul a fost deschis pt. citire
if ($fp = fopen($fisier, rb)) {
fseek($fp, 40);
// Seteaza pozitia pointer-ului in fisier
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server);
// Executa conectare (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) {
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul
$ftp_user a iesuat.";
exit;
}
else {
$destinatie = '/www/[Link]';
// Directorul destinatie si
numele fisierului
// Transfera continutul intr-un fisier nou pe server
// Afiseaza mesaj de reusita sau nu
if (ftp_fput($conn_id, $destinatie, $fp, FTP_BINARY)) echo 'Continutul a fost
transferat';
else echo 'Eroare, continutul nu a putut fi transferat';
}
// Inchide conexiunea
ftp_close($conn_id);
// Elibereaza memoria ocupata de deschiderea fisierului
fclose($fp);
}
?>
- Daca fisierul "[Link]" a fost deschis pentru citire, functia "fseek($fp,
40)" muta pointer-ul la pozitia 40, astfel va fi retinut continutul din fisier
care incepa de la caracterul 41 pana la sfarsit (primul caracter are pozitia
0).
- In continuare, daca s-a efectuat cu succes conexiunea si autentificarea
prin FTP, se transfera continutul in fisierul "[Link]" din directorul "www"
de pe server (daca fisierul "[Link]" exista deja pe server, continutul lui
va fi inlocuit cu cel transferat).
In cazul in care doriti sa transferati intreg continutul unui fisier deschis cu
"fopen()", nu este necesara utilizarea funtiei "fseek()".
Aceasta metoda este utila cand doriti sa adaugati un sir sau continut, de
exemplu preluat dintr-un form, pe server prin FTP. Adaugati sirul intr-un
fisier temporar pe care apoi il deschideti cu "fopen()" si transferati
continutul cu "ftp_fput()".
Pentru stergerea unui fisier se foloseste functia ftp_delete(conn_id,
'cale/fisier'), unde "conn_id" este id-ul conexiunii iar "cale/fisier" este
calea si numele fisierului care va fi sters.
7. Alte functii utile pentru FTP
Pe langa functiile prezentate in exemplele de mai sus, PHP are si alte
functii utile pentru lucrul cu fisiere si directoare prin FTP.
Iata cateva din acestea:
ftp_cdup(conn_id) - Schimba ca director curent de lucru directorul parinte
ftp_chmod(conn_id, octal_CHMOD, fisier)
a unui fisier prin FTP
- Seteaza permisiunile CHMOD
ftp_mdtm(conn_id, fisier)
- returneaza timpul, in format Unix, cand a fost
ultima data modificat un fisier
ftp_pwd(conn_id)
- Returneaza numele directorului curent de lucru
ftp_rename(conn_id, nume_actual, nume_nou)
- Modifica numele unui
director sau fisier
ftp_size(conn_id, fisier)
- Returneaza marimea fisierului specificat, in
bytes (unele servere nu suporta aceasta functie)
O lista completa cu functiile PHP pentru FTP gasiti la adresa din urmatorul link Functii
PHP pentru FTP
PHP OOP - Clase si Obiecte, Metoda constructor
OOP (Object Oriented Programming - Programare Orientata pe obiecte)
este un concept (sau tehnica) de programare care trateaza datele si
functiile ca obiecte. Important la acest concept este sa fie inteleasa bine
diferenta dintre Clasa (Class) si Obiect (Object).
Inainte de a trece la lucruri practice, iata cate ceva teoretic despre OOP.
Clasa este o structura de date compacta, care contine variabile
(numite proprietati) si functii (numite metode) prin care se pot crea
diferite instructiuni legate intre ele in acea structura.
Obiectele sunt elementele din script create cu o clasa, si prin care se
pot folosi proprietatile si metodele din acea clasa.
- De exemplu, pentru a intelege mai bine, prin analogie, o Clasa poate fi
asemanata cu planul /schita unei case, iar obiectul este insasi casa, si
contine proprietatile (culoare, ferestre, etc.) definite in schita. Precum,
folosind acelasi plan se pot construi mai multe case, asa si in OOP,
folosind aceeasi clasa se pot crea unul sau mai multe obiecte prin care
se aplica in script proprietatile si functiile definite in clasa.
Practic, o clasa este o "fabrica" de obiecte, prin care se creaza obiecte cu aceeasi
structura, avand proprietati si metode identice. Fiecare astfel de obiect creat poarta
denumirea de Instanta a clasei.
In OOP (Programarea Orientata pe Obiect) apar termenii:
"Encapsulation" (Encapsulare), "Inheritance" (Mostenire) si
"Polymorphism" (polimorfism.).
- Encapsularea reprezinta faptul de a utiliza proprietatile si
metodele clasei fara a fi necesara cunoasterea sructurii ei. Astfel, cine
foloseste o clasa intr-un script nu are nevoie sa cunoasca structura
codului si instructiunilor din ea.
- Mostenirea e abilitatea unei clase de a folosi proprietati si functii
definite in alta clasa din care este extinsa (denumita parinte).
- Polimorfismul e abilitatea unei clase de a face mai multe lucruri,
diferite, sau de a utiliza o clasa sau alta pentru a realiza lucrul dorit,
avand functii similare. De exemplu, o rigla poate fi utilizata pentru a trasa
linii dar si pt. a masura ceva, iar pentru a trasa linii se poate folosi si alta
rigla dreapta. Acesta e polimorfism.
Pentru cine este obijnuit cu modul de creare a claselor in PHP 4, incepand de la
versiunea PHP 5 sunt unele schimbari de sintaxa:
- Proprietatile nu se mai declara cu var
- Metoda Constructor se defineste cu numele __construct
1. Creare clasa
Definirea unei clase incepe cu un cuvantul cheie "class", urmat de
numele clasei si corpul ei (cuprins intre acolade). In corpul clasei se
definesc proprietatile si metodele ei.
- Proprietatile sunt variabile definite in interiorul clasei.
- Metodele sunt functii create in interiorul clasei.
Structura general de alcatuire a unei clase este urmatoarea:
class nume_clasa {
$proprietate;
function metoda() {
// Codul functiei
}
}
Pentru a construi o clasa profesionala, cu elemente incluse in PHP 5+,
sunt necesare si alte lucruri care trebuie adaugate.
- La definirea unei clasei si a elementelor din ea (proprietati, metode) se
pot aplica unele atribute speciale prin care se defineste domeniul lor de
lucru (de existenta). Acest atribut se adauga inaintea variabilei sau a
cuvantului functions, si poate fi unul din cuvintele:
public - valabil in tot scriptul
private - valabil doar in interiorul acelei clase
protected - valabil doar in acea clasa si sub-clasele extinse din ea
- Daca nu e adaugat nici un atribut, se considera "public".
Astfel, formula completa pentru crearea unei clase este:
class Nume_Clasa {
atribut $proprietate1;
atribut $proprietate2;
.................
atribut function metoda1() {
// Codul functiei
}
atribut function metoda2() {
// Codul functiei
}
.................
}
- Pentru o mai buna organizare, este indicata crearea fiecarei clase intr-un
fisier PHP separat si cu o denumire de forma "class.Nume_Clasa.php".
Acest lucru nu e obligatorriu, doar ca indicatie; clasa poate fi creata si in
scriptul unde e folosita.
Iata un exemplu de clasa simpla, ce contine doua proprietati, prima cu
atribut public (denumita $site), a doua private (denumita $categorie) si o
metoda cu atribut public (cu numele "pagini").
Exemplu SiteClas
<?php
// Se defineste clasa SiteClas
class SiteClas {
public $site = '[Link]/';
// Proprietatea publica
private $categorie = 'php-mysq/';
// Proprietate privata
// Creare metoda, preia un argument
public function pagini($pag) {
// Afiseaza adresa URL formata din valoarea celor 2 proprietati si argumentul
primit
echo '<br />'. $this->site. $this->categorie. $pag;
}
}
?>
- Aceasta este clasa "SiteClas", pentru a-o putea folosi in orice script, sa o
salvam intr-un fisier separat, denumit "[Link]".
- Formula "$this->site" indica /face sa fie apelata proprietatea "site" a
obiectului curent din aceasta clasa (termenul $this (acesta, aceasta)
indica precis ca se face referire la proprietatea respectiva, din instanta
curenta).
Cand se acceseaza proprietati se foloseste un singur caracter $. Sintaxa este $obj>proprietate, desi variabila e definita "$proprietate".
2. Utilizare clasa
Dupa ce o clasa e creata, pentru a putea fi utilizata trebuie creata o
instanta de obiect a clasei. Aceasta instanta se declara in scriptul PHP,
cu formula:
$nume_obiect = new Nume_Clasa();
- "nume_obiect" este numele obiectului prin care pot fi utilizate
proprietatile si metodele acelei clase.
Iata cum poate fi utilizata clasa "SiteClas" prezentata mai sus (pt.
explicatii, studiati si comentariile din cod).
<?php
include('[Link]');
$objSite = new SiteClas();
// Include clasa
// Creare instanta de obiect la clasa SiteClas
echo $objSite->site;
// Afisaza valoarea proprietatii "site"
// Apeleaza metoda pagini() [cu un argument, dupa cum a fost definita]
$objSite->pagini('[Link]');
// Modifica valoarea proprietatii "site" si apeleaza iar metoda pagini()
$objSite->site = '[Link]/';
$objSite->pagini('[Link]');
?>
- La include() trebuie adaugata calea si numele fisierului cu clasa, in
raport cu scriptul curent (aici sunt in acelasi director).
- Inainte de a putea utiliza proprietati si metode din clasa, trebuie creata o
instanta de obiect, deoarece prin aceasta se apeleaza aceste elemente,
dupa sintaxa:
$obiect->element
- Prin apelarea metodei "pagini()" ( $objSite->pagini('[Link]'); ) se va executa codul functiei "pagini()" definita in clasa,
care afiseaza intr-un sir o adresa URL compusa din valorile proprietatilor si
argumentul primit.
- Observati ca valoarea proprietatilor poate fi modificata in cadrul
scriptului. Proprietatea "site" poate fi apelata atat pentru a fi utilizata
/afisata valoarea ei cat si pentru adaugarea altei valori (aici sirul '[Link]/').
- In browser va afisa:
[Link]/
[Link]/php-mysq/[Link]
[Link]/php-mysq/[Link]
Daca se incearca apelarea proprietatii private (aici "categorie"), de
ex.: echo $objSite->categorie; , va determina o eroare ca cea de jos.
Aceasta proprietate fiind declarata private poate fi utilizata doar in codul
din interiorul clasei.
Fatal error: Cannot access private property SiteClas::$categorie in
E:\server\www\[Link] on line 15
Valoarea data unei proprietati definita in clasa poate fi de orice tip: sir (string), numar,
Array sau Object.
3. Metoda constructor
Metoda constructor e un tip special de functie din interiorul Clasei.
Se declara cu numele __construct (doua caractere "_" in fata). Aceasta
metoda este mereu "public" chiar daca nu se mentioneaza special
atributul "public". Diferenta fata de celelalte functii este aceea ca
Metoda Constructor e apelata automat cand se creaza o instanta la clasa
respectiva, codul din ea se executa in momentul cand e creat obiectul
(cu new).
Iata o noua versiune a clasei "SiteClas", care include si metoda
constructor, plus o metoda cu atribut protected.
<?php
// Se defineste clasa SiteClas
class SiteClas {
public $site = '[Link]/';
// Proprietate publica
private $categorie = 'php-mysq/';
// Proprietate privata
// Definire metoda constructor
public function __construct($nume) {
// Afiseaza un mesaj de bun venit, incluzand proprietatea "site"
echo 'Bine ai venit '. $nume. ' pe '. $this->site. '<br />';
echo $this->Mesaj();
// adauga si ce returneaza metoda Mesaj()
}
// Metoda protected
protected function Mesaj() {
// Returneaza un mesaj cu proprietatea 'categorie'
return 'Categoria de cursuri '. $this->categorie;
}
// Creare metoda, preia un argument
public function pagini($pag) {
// Afiseaza adresa URL formata din valoarea celor 2 proprietati si argumentul
primit
echo '<br />'. $this->site. $this->categorie. $pag;
}
}
?>
- Deoarece Metoda Constructor preia un parametri ($nume) [se pot
adauga mai multi, ca la orice functie], cand se creaza o instanta la
aceasta clasa trebuie sa fie adaugat si un argument.
<?php
include('[Link]');
// Include clasa
// Creare instanta de obiect la clasa SiteClas, cu argumentul necesar
$objSite = new SiteClas('Marius');
?>
- Prin executia metodei "__construct()", apelarea $this->Mesaj() determina
si executia metodei Mesaj(), care avand atribut "protected" poate fi
apelata doar in codul din corpul clasei sau alte clase extinse din ea
(despre clase extinse intr-o lectie viitoare).
- Acest cod simplu va returna in fereastra urmatorul mesaj:
Bine ai venit Marius pe [Link]/
Categoria de cursuri php-mysq/
- Fapt ce demonsreaza ca Metoda Constructor este apelata automat si se
executa codul din ea cand e creata instanta de obiect.
Dupa cum se arata in exemplu de sus, in metoda constructor pot fi apelate si alte
metode sau proprietati definite in clasa, cu sintaxa $this-> , fapt ce va face ca si acele
metode sa fie executate cand e creat obiectul.
- Daca se apeleaza in script (in afara clasei) o metoda "protected" sau "private" (de ex.,
aici: $objSite->Mesaj();) va genera eroare.
Daca metoda constructor e definita cu un anumit numar de parametri,
fara valoare initiala, cand se creaza instanta de obiect, clasa trebuie sa fie
apelata cu acelasi numar de argumente, altfel returneaza eroare.
De ex., metoda constructor din exemplu precedent e definita cu un
parametru ($nume), daca s-ar crea o instanta fara argument, de
forma: $obj = new SiteClass(), va genera o eroare de genul:
Missing argument 1 for SiteClas::__construct(), called in ...
Dar se pot declara parametri cu valoare deja atribuita, astfel, argumentul
pentru ei devine optional.
De ex., in clasa Test de mai jos, metoda constructor e definita cu
parametru $nume='Tu'.
<?php
class Test {
// Constructor (cu un parametru cu valoare predefinita)
public function __construct($nume='Tu') {
echo '<br />Salut '. $nume;
}
}
?>
- Daca instanta e creata fara argument, metoda constructor va folosi
parametru $nume cu valoarea lui prestabilita ("Tu"), iar cand e adaugat
argument, preia valoarea acestuia; dupa cum arata rezultatul afisat de
scriptul urmator, in care se creaza doua instante de obiect la clasa Test.
<?php
// Creare instanta de obiect la clasa Test, fara argument
$obj1 = new Test();
// A doua instanta de obiect la clasa Test, cu argument
$obj2 = new Test('Marius');
?>
- Acest exemplu arata si faptul ca se pot crea si folosi mai multe instante
de obiect la aceeasi clasa.
- In browser apare:
Salut Tu
Salut Marius
In lectia urmatoare sunt prezentate metodele accesor si _destruct().
PHP OOP - metode Accesor si Destructor
1. Metoda Accesor
Variabilele (proprietatile) create intr-o clasa pot avea de la inceput o
valoare sau pot fi doar simplu declarate, urmand ca valoarea lor sa fie
atribuita prin intermediul unei functii (metode). Aceasta functie e
denumita generic Metoda Accessor, e la fel ca oricare alta metoda,
doar ca scopul ei este de a atribui valori proprietatilor; in rest, se
construieste si se apeleaza la fel ca celelalte.
Ca sa vedeti cum functioneaza "metoda accessor", incercati urmatorul
exemplu, in care este creata o clasa "SiteClas" cu doua proprietati ('site'
si 'categorie'), ambele fara valoare, iar metoda Constructor e folosita si
ca accesor, atribuie valori proprietatilor prin parametri ei.
<?php
// Se defineste clasa SiteClas
class SiteClas {
public $site;
// Proprietate declarata fara valoare
private $categorie;
// Proprietate privata, fara valoare
// Constructor
public function __construct($site, $categorie) {
// Atribuie proprietatilor valoarea din parametri
$this->site = $site;
$this->categorie = $categorie;
}
// Metoda pt. afisare adresa pagini
public function pagini($pag) {
// Afiseaza un sir cu adresa URL, www., valoarea celor 2 proprietati si argumentul
primit
echo '<br />www.'. $this->site.'/'. $this->categorie.'/'. $pag;
}
}
?>
- Cand e creata instanta de obiect la clasa, metoda constructor (care se
executa automat) atribuie proprietatilor "site" si "categorie" valorile din
parametri, care trebuie adaugate la crearea instantei.
- Metoda pagini(), cand e apelata, afiseaza o adresa URL formata din
valoarea proprietatilor "site", "categorie" (atribuite prin constructor) si
argumentul ei $pag.
- Salvam clasa intr-un fisier denumit "[Link]", iar pentru test,
se adauga urmatorul cod intr-un fisier .php salvat in acelasi director unde
e si clasa.
<?php
include('[Link]');
// Include clasa
// Creare instanta de obiect la clasa SiteClas, cu argumentele necesare
$objSite = new SiteClas('[Link]', 'php-mysql');
$objSite->pagini('[Link]');
// Apelare metoda pagini()
?>
- Dupa executie, in browser va afisa:
[Link]/php-mysql/[Link]
Valoarea proprietatii "site", avand atribut "public", poate fi modificata si
pe parcurs in script, cu expresia:
$objSite->site = valoare;
2. Accesare si modifi care proprietati prin metode Accesor
Variabilele in PHP nu au un tip de date stabilit precis la declararea lor,
de exemplu, o variabila poate sa contina initial ca valoare un numar, iar
pe parcursul scriptului sa i-se atribuie ca valoare un sir sau un Array.
Aceasta flexibilitate este folositoare, dar in unele situatii poate prezenta
probleme in anumite contexte din codul unei metode.
De exemplu, daca intr-o metoda se parcurg datele dintr-o proprietate de
tip Array iar in script acea proprietate primeste o valoare de tip Sir, apar
erori.
Pentru a fi siguri ca o proprietate primeste doar tipul de date care poate
fi corect utilizat, se declara ca private si se folosesc metode accesor
pentru accesarea ei, cu functii PHP de verificare a tipului de date. Aceste
functii sunt:
is_bool() - Boolean - una din valorile speciale: true sau false
is_integer() sau is_int() - Integer - numere intregi (fara virgula)
is_float() sau is_double() - Float /Double - numere cu zecimale (cu virgula)
is_numeric() - Number - orice numar sau sir ce reprezinta un numar
is_string() - String - siruri de caractere si cuvinte
is_array() - Array - Array
is_object() - Object - Obiect
is_resource() - Resource - un identificator pentru lucru cu date din sure
externe (fisier, baza de date)
is_null() - Null - Valoare NULL sau nedefinita
Iata o alta versiune a clasei TestClas. Ambele proprietati sunt declarate
"private", ca sa nu fie modificate in mod direct in afara clasei. Valorile
initiale le primesc la crearea instantei (prin constructor). Pentru a putea
accesa si modifica proprietatea "categorie" in script, se creaza special
cate o metoda accesor: getCategorie() si setCategorie() (vedeti si
explicatiile din cod).
<?php
// Se defineste clasa SiteClas
class SiteClas {
// Definire proprietati private, fara valoare
private $site;
private $categorie;
// Constructor
public function __construct($site, $categorie) {
// Atribuie proprietatilor valoarea din parametri
$this->site = $site;
$this->categorie = $categorie;
}
// Metoda accesor - returneaza valoarea proprietatii 'categorie'
public function getCategorie() {
return $this->categorie;
}
// Metoda accesor pt. setare valoare la "categorie"
public function setCategorie($val) {
// Daca $val e de tip Sir (string) si are cel putin un caracter
// Atribuie valoarea lui proprietatii 'categorie'
// Altfel, returneaza eroare
if(is_string($val) && strlen($val)>0) {
$this->categorie = $val;
}
else throw new Exception('Valoare incorecta pt. categorie');
}
// Metoda pt. afisare adresa pagini
public function pagini($pag) {
// Afiseaza un sir cu adresa URL, www., valoarea celor 2 proprietati si argumentul
primit
echo '<br />www.'. $this->site.'/'. $this->categorie.'/'. $pag;
}
}
?>
- Prin declararea proprietatilor ca "private", se respinge accesul direct la
ele in afara clasei, iar pt. proprietatea "categorie" s-a creat posibilitatea
de a fi accesata si modificata valoarea ei prin metodele
accesor: getCategorie() si setcategorie($val).
- In setCategorie($val) se atribuie valoarea transmisa pt. $val la
"categorie" (prin formula $this->categorie = $val;) doar daca $val e de tip
Sir (String) si are cel putin un caracter; altfel, utilizand formula speciala
"throw new Exception('Eroare')" returneaza un mesaj de eroare.
- Pentru a testa efectul acestor metode, se executa scriptul urmator, in
care e utilizata o instanta la aceasta clasa.
<?php
include('[Link]');
// Include clasa
// Creare instanta de obiect la clasa SiteClas
$objSite = new SiteClas('[Link]', 'php-mysql');
// Afiseaza valoarea returnata de getCategorie() (reprezentand valoarea proprietatii
"categorie")
echo $objSite->getCategorie();
// Modifica prin setCategorie() valoarea proprietatii "categorie"
$objSite->setCategorie('html');
$objSite->pagini('[Link]');
// Apelare metoda pagini()
?>
- In browser scriptul va afisa:
php-mysql
[Link]/html/[Link]
- "php-mysql" este valoarea initiala data proprietatii "categorie" prin
crearea instantei la clasa. Dar prin modificarea ei cu $objSite>setCategorie('html');, metoda pagini() va utiliza proprietatea "categorie"
cu aceasta valoare (html).
3. Metoda Destructor
Metoda Destructor se creaza cu numele __destruct (doua caractere
'_' la inceput). Aceasta metoda este opusul lui __construct. Daca metoda
constructor e apelata automat cand se creaza o instanta de obiect la
clasa, metoda Destructor se apeleaza automat cand e stearsa,
cu unset(), instanta la acea clasa.
Se intelege mai bine din urmatorul exemplu. Clasa Test de mai jos
contine o proprietate privata, "nume", o metoda accesor "setNume()",
metoda constructor si destructor.
<?php
// Clasa Test
class Test {
private $nume;
// Constructor
public function __construct($nume) {
// Atribuie proprietatii 'nume' valoarea din parametru
// si afiseaza un mesaj
$this->nume = $nume;
echo 'Bine ai venit '. $this->nume. '<br />';
}
// Metoda accesor - schimba valoarea proprietatii 'nume'
public function setNume($nume) {
$this->nume = $nume;
}
// Metoda Destructor
function __destruct() {
echo 'Cu bine '. $this->nume;
}
}
?>
- Ca sa testam efectul metodei __destruct, se foloseste urmatorul script
(vedeti explicatiile din cod).
<?php
// Creare instanta de obiect la clasa Test
$obj = new Test('Mar');
// Apeleaza metoda setNume(), care seteaza alta valoarea la prop. 'nume'
$obj->setNume('Plo');
// Sterge instanta de obiect $obj
unset($obj);
?>
- Prin argumentul 'Mar' adaugat la crearea instantei, metoda constructor
atribuie aceasta valoare proprietatii "nume", pe care o afiseaza in mesajul
returnat.
- Apelarea metodei setNume() modifica valoarea acestei proprietati, iar
cand instanta de obiect e stearsa, cu unset($obj), se autoapeleaza
metoda "__destruct" si determina executia codului din ea, care va afisa alt
mesaj, cu proprietatea "nume" avand ultima valoare setata.
- Rezultatul afisat in browser este:
Bine ai venit Mar
Cu bine Plo
Metoda destructor este utila cand se doreste executarea automata a unor ultime
instructiuni cand instanta la clasa e stearsa din memorie prin apelarea functiei PHP
unset().
In lectia urmatoare sunt prezentate Constante si elemente Statice in
Clasele PHP.
OOP - Constante, Proprietati si Metode Statice
1. Constante
Pe langa proprietati (variabile) si metode (functii), in corpul clasei pot fi
definite si constante, prin cuvantul const. Sintaxa generala este:
const NUME_CONSTANTA;
- Diferenta principala dintre constante si proprietati e faptul ca valoarea
constantei ramane aceeasi, nu mai poate fi modificata.
- La constante nu se foloseste atribut (public, private, protected), doar
cuvantul const, ele sunt recunoscute ca publice.
- Constantele se acceseaza prin numele clasei si operatorul doua-puncte
(::) (atat in interiorul clasei cat si in script unde e creata instanta), cu
formula:
Nume_Clasa::NUME_CONSTANTA
Pentru a se distinge mai clar proprietatile de constante, se obisnueste ca numele
constantelor sa fie scris cu majuscule.
Iata un exemplu de clasa cu o constanta, si cum poate fi aceasta utilizata.
Clasa Test de mai jos contine o proprietate "raza", o constanta "PI",
metoda constructor si o metoda "getArea()".
<?php
// Clasa Test
class Test {
public $raza;
const PI = 3.14;
// Proprietate
// Constanta
// Constructor
public function __construct($raza) {
// Daca $raza e un numar, atribuie valoarea la proprietatea "raza"
// Altfel, seteaza un mesaj de eroare
if(is_numeric($raza)) $this->raza = $raza;
else throw new Exception('Valoare incorecta pt. raza');
}
// Returneaza aria cercului
public function getArea() {
return Test::PI * pow($this->raza, 2);
}
}
?>
- Metoda constructor verifica daca argumentul adaugat la crearea
instantei este de tip numar, in caz Adevarat, atribuie acea valoare la
proprietatea "raza". Altfel, returneaza eroarea definita in Exception().
- Metoda getArea() returneaza aria cercului (formula matematica
este PI*Raza2).
- Pentru a testa aceasta clasa si modul de accesare a constantei, folosim
urmatorul script.
<?php
echo Test::PI;
// Afiseaza valoarea constantei PI din clasa Test
// Creare Instanta la clasa Test
$objTest = new Test(78);
// Afiseaza aria cercului cu raza 78, returnata de metoda getArea()
echo '<br /> Aria = '. $objTest->getArea();
?>
- Observati cum e accesata constanta "PI", cu aceeasi formula in interiorul
clasei si in script, inainte de a crea instanta la clasa. Astfel, constantele
pot fi accesate si fara a crea o instanta de obiect la acea clasa.
- Rezultatul afisat de acest exemplu este:
3.14
Aria = 19103.76
Daca se incearca modificarea valorii constantei, in clasa sau in afara ei
(Clasa::CONSTANTA=alta_valoare;), va genera eroare.
- In interiorul clasei, constantele pot fi accesate si prin cuvantul special self in loc de
numele clasei:
self::CONSTANTA
- In afara clasei, constantele pot fi accesate si prin intermediul instantei de obiect, dar
dupa crearea ei. In exemplu de mai sus, dupa declararea instantei se poate folosi si
$objTest::PI;
2. Proprietati si metode Statice
Pe langa atributele: "public", "private" si "protected"; prin care se
defineste domeniul de acces al proprietatilor si metodelor; acestea pot fi
create si ca statice, astfel, vor apartine exclusiv clasei, si nu pot fi
apelate prin instanta de obiect a clasei, ci direct prin ea, cu operatorul
doua-puncte (::).
Pentru a defini o proprietate sau metoda ca statica, se foloseste
cuvantul static inaintea atributului, cand sunt create aceste elemente.
Sintaxa generala este:
static atribut $proprietate
static atribut function Metoda()
- atribut este unul din cuvintele: public, private sau protected; care
stabilesc domeniul de existenta.
Aceste elemente statice nu pot fi apelate prin instanta de obiect
deoarece nu apartin ei, ele apartin clasei si pot fi apelate cu formula:
NumeClasa::$proprietate
NumeClasa::metoda()
- Observati ca la proprietate, cand e statica trebuie adaugat si caracterul
$ (fara caracterul '$', sintaxa "NumeClasa::proprietate" este confundata
cu cea pt. constante).
In interiorul clasei, elementele statice pot fi apelate si prin cuvantul
special self in loc de numele clasei:
self::$proprietate
sau
self::Metoda()
Iata un exemplu din care se intelege mai bine. In clasa urmatoare,
denumita "elStatic" se definesc doua proprietati statice: una cu atribut
"private" (site), a doua publica (id); o metoda constructor si alta statica.
<?php
// Clasa elStatic
class elStatic {
// Definire proprietati statice
static private $site = '[Link]';
static public $id = 78;
// Privata
// Publica
// Constructor
public function __construct($site) {
// Daca parametru $site e de tip String si cel putin 4 caractere
// Atribuie valoarea la proprietatea "site" si apeleaza metoda getProp()
// Altfel, seteaza un mesaj de eroare
if(is_string($site) && strlen($site)>3) {
elStatic::$site = $site;
self::getProp();
// Apelare prin cuvantul special self
}
else throw new Exception('Valoare incorecta pt. site');
}
// Metoda statica
static public function getProp() {
// Afiseaza valoarea proprietatilor statice (folosind numele clasei, dar si cuvantul
self )
echo '<br /> ID = '. elStatic::$id. ' - site: '. self::$site;
}
}
?>
- Vedeti explicatiile din cod si modul de lucru, cum sunt accesate
proprietatile si metoda statica.
- Deoarece elementele statice apartin direct clasei, pentru utilizarea lor nu
e nevoie de crearea unei instante la aceasta clasa. Dar se pot folosi si
instante, acestea determina auto-apelarea metodei constructor, dupa
cum puteti vedea in scriptul urmator, care foloseste elemente din clasa
"elStatic" si o instanta la ea.
<?php
echo elStatic::$id;
// Afiseaza valoarea proprietatii statice "id"
elStatic::getProp();
// Apeleaza metoda statica getProp()
elStatic::$id = 89;
// Modifica valoarea proprietatii statice "id"
// Creare Instanta la clasa elStatic
$obj = new elStatic('[Link]');
?>
- Observati ca valoarea proprietatii statice care e publica (aici "id") poate
fi schimbata in afara clasei si influenteaza dupa ea toate instructiunile in
care e folosita (ca si cum ar fi modificata in clasa), inclusiv orice instanta
la clasa, creata dupa modificare.
- Acest exemplu va afisa in browser urmatorul rezultat:
78
ID = 78 - site: [Link]
ID = 89 - site: [Link]
- Prin crearea instantei s-a obtinut rezultatul dat de metoda constructor.
Intr-o clasa se pot folosi combinate: constante, metode si proprietati
statice si generale (fara "static"), dar in corpul metodelor statice se pot
utiliza doar elemente care si ele sunt statice, sau constante. Accesarea in
codul dintr-o metoda statica a unei proprietati cu formula $this>proprietategenereaza eroare.
$this face referire la instanta de obiect curenta, self se refera la clasa curenta.
La pagina Functii - clase si obiecte sunt prezentate cateva functii PHP
pentru Clase si Obiecte.
In lectia urmatoare e prezentata utilizarea mostenirii si clasele extinse.
PHP OOP - Clase extinse si Mostenire
Mostenirea este unul din cele mai utile instrumente ale Programarii
Orientate pe Obiect - OOP.
Prin mostenire se intelege transmiterea proprietatilor, constanttelor si a
functiilor de la o clasa la alta, intr-o structura ierarhica. Prima clasa este
clasa de baza, denumita "parinte", legata de aceasta se poate crea o
sub-clasa, denumita "copil"; sub-clasa 'copil' mosteneste proprietatile si
metodele clasei 'parinte' (cele care sunt cu atribut "public" sau
"protected"), le poate folosi in instructiunile din propriul cod si le
transmite cand se creaza o instanta de obiect la ea. Precum in natura
copii mostenesc genele parintilor.
1. Creare clasa copil
Sub-clasa "copil" se creaza cu formula:
class ClasaCopil extends ClasaParinte
Iata cum se aplica acest procedeu in programarea PHP OOP.
In exemplu prezentat aici se construieste intai o clasa de baza, denumita
Site, cu doua proprietati: una cu atribut private (site), alta cu atribut
public (categorie), constructor si o metoda getPag().
<?php
// Clasa Site
class Site {
// Definire proprietati, private si public
private $site;
public $categorie = 'php-mysql';
// Constructor
public function __construct($site) {
// Daca parametru $site e un Sir cu cel putin 5 caractere, atribuie valoarea la
proprietatea "site"
// Altfel, seteaza un mesaj de eroare
if(is_string($site) && strlen($site)>4) $this->site = $site;
else throw new Exception('Valoare incorecta pt. site');
}
// Metoda getPag()
public function getPag($pag) {
// Defineste si returneaza adresa URL a paginii
$url = $this->site. '/'. $this->categorie. '/'. $pag;
return $url;
}
}
?>
- Metoda Constructor atribuie valoarea din parametru $site la proprietatea
"site".
- Metoda getPag() returneaza o adresa URL formata din proprietatile clasei
si parametru ei.
Salvam aceasta clasa intr-un fisier "[Link]".
Aceasta clasa poate fi utilizata pentru afisarea unui sir cu o adresa URL,
prin apelarea metodei getPag(). Daca vrem sa obtinem aceasta adresa
intr-un tag HTML tip link (<a>) se poate crea o noua metoda, pentru alta
facilitate alta metoda, si tot asa se aglomereaza codul clasei, fapt ce
devine o problema in cazul unor clase mari. O alta varianta este crearea
unei sub-clase extinse din aceasta. Sub-clasa (copil) are abilitatea de
a mosteni /utiliza toate proprietatile si metodele definite ca publice si
protected in clasa de baza (parinte) ca si cum ar fi create in ea (fara sa
mai fie scrise inca o data). Astfel, in clasa copil se creaza doar
instructiunile cu noua functie pe care o dorim, si nici nu mai trebuie
modificata clasa parinte.
In continuarea acestui exemplu se creaza o alta clasa, denumita LinkSite,
ca extindere a clasei Site. Ea contine doar o metoda getLink() pentru
afisarea unui link.
<?php
include('[Link]');
// Include clasa parinte (Site)
// Creare clasa copil LinkSite, extinsa din Site
class LinkSite extends Site {
// Metoda getLink()
public function getLink($pag) {
// Afiseaza un link format din getPag() si "categorie" din clasa parinte
echo '<a href="[Link] $this->getPag($pag). '" title="'. $this->categorie.
'">Link</a><br />';
}
}
?>
Salvam aceasta clasa, cu denumirea "[Link]" in acelasi
director unde e salvata si clasa Site.
Acum, atentie la explicatii:
- Pentru a avea acces la definitiile din clasa principala Site, deoarece se
afla intr-un fisier extern, o includem cu include().
- Cuvantul special "extends" stabileste identitatea clasei LinkSite ca fiind
o extindere a clasei Site.
- In metoda getLink() se folosesc proprietatea "categorie" si metoda
"getPag()" din clasa parinte ca si cum ar fi fost definite in aceasta clasa.
Aceste elemente pot fi accesate in clasa copil deoarece au atribut
"public" (functioneaza si cu "protected"). Dar proprietatea "site", care are
atribut "private" in clasa parinte, nu poate fi accesata in cea copil.
- Desi aceasta clasa nu are o metoda constructor, ea mosteneste
constructorul clasei parinte, astfel, cand se creaza o instanta de obiect la
clasa LinkSite trebuie adaugat si un argument de tip Sir, deoarece asa e
definita metoda "__construct($site)" in clasa de baza (Site).
Sa testam aceasta clasa copil, cu scriptul urmator.
<?php
include('[Link]');
// Include fisierul cu subclasa LinkSite
// Creare instanta la clasa copil LinkSite
$objLink = new LinkSite('[Link]');
// Apeleaza metoda getLink() (definita in clasa copil);
$objLink->getLink('[Link]');
// Modifica valoarea proprietatii "categorie" (aflata in clasa parinte)
$objLink->categorie = 'ajax';
// Afiseaza rezultatul dat de metoda getPag() (creata in clasa parinte)
echo $objLink->getPag('[Link]');
?>
- Deoarece clasa LinkSite se afla intr-un fisier PHP extern, o includem
cu include().
- La crearea instantei de obiect se adauga si argumentul necesar, un sir
('[Link]'), cerut de metoda constructor a clasei de baza, care e
si ea mostenita.
- Observati cum sunt accesate proprietatea "categorie" si metoda
"getPag()" (care se afla in clasa parinte), prin instanta de obiect la clasa
copil (LinkSite) ca si cum ar fi create in ea. Acesta este efectul mostenirii,
atat de util in OOP.
In browser va afisa urmatorul rezultat:
Link
[Link]/ajax/[Link]
2. Redefi nire metode
In exemplu de mai sus, clasa copil LinkSite a mostenit si metoda
"__construct()" din clasa parinte Site, fapt ce determina executarea
codului din acel Constructor si cand e creata instanta la clasa copil.
Uneori aceasta functie nu e adecvata in sub-clasa. Pentru a evita acest
lucru, metodele inadecvate pot fi rescrise prin adaugarea uneia cu
acelasi nume in clasa copil, astfel, la crearea instantei, va fi utilizata
metoda, cu acelasi nume, din clasa copil.
- Rescrierea unei metode nu afecteaza cu nimic pe cea originala,
modificarile efectuate sunt valabile doar in clasa copil in care se face
rescrierea, respectiv, in alte sub-clase ale ei.
Iata o alta sub-clasa (PagSite) extinsa din Site. Aici se adauga si o metoda
"__construct()" care o va anula pe cea din clasa parinte, se rescrie si
metoda getPag().
<?php
include('[Link]');
// Include clasa parinte (Site)
// Creare clasa copil PagSite, extinsa din Site
class PagSite extends Site {
public $domeniu = '[Link]';
// Proprietate
// Constructor, rescrie pe cel din parinte (Site)
function __construct() {
// Fara instructiuni, executa nimic
}
// Metoda getPag(), rescrisa
public function getPag($pag) {
// Preia functionalitatea metodei getPag() din clasa parinte
$url = parent::getPag($pag);
// ... alte instructiuni pt. metoda getPag()
// Adauga in $url si valoarea proprietatii "domeniu"
$url = $this->domeniu. $url;
return 'Pagina: '. $url;
}
}
?>
- Prin crearea in aceasta sub-clasa a metodei "__construct()" se anuleaza
efectul celei din clasa parinte, si neavand parametru, nici la creare
instantei nu se mai adauga vreun argument.
- Pentru a pastra si functionalitatea initiala (din clasa parinte) a metodei
rescrise, in corpul functie care face rescrierea, se adauga cu
formulaparent::nume_metoda() (tehnica folosita si in exemplu de sus,
la getPag()).
In scriptul urmator se foloseste aceasta a doua sub-clasa.
<?php
include('[Link]');
// Include fisierul cu aub-clasa PagSite
// Creare instanta la clasa copil PagSite
$objPag = new PagSite();
// Modifica valoarea proprietatii "categorie" (aflata in clasa parinte)
$objPag->categorie = 'html';
// Afiseaza rezultatul dat de metoda getPag() (rescrisa)
echo $objPag->getPag('[Link]');
?>
- Instructiunea $objPag->getPag('[Link]') apeleaza metoda
"getPag()" din clasa la care s-a creat instanta de obiect (PagSite) deoarece
exista cu aceasta denumire in ea. Se observa si din rezultatul afisat:
Pagina: [Link]/html/[Link]
3. Metode fi nale
In exemplu prezentat mai sus se vede cum o metoda din clasa de baza
poate fi rescrisa in sub-clasa copil, dandu-i alta functionalitate. Sunt
situatii in care nu se doreste ca o metoda sa poata fi rescrisa, in acest
caz, prin adaugarea cuvantului final la inceputul declararii metodei se
blocheaaaza posibilitatea rescrierii ei.
- De exemplu:
<?php
// Clasa Baza
class Baza {
// Metoda final
final public function numeMet() {
// Instructiunile functiei
}
}
// Definire clasa-copil din Baza
class CopilBaza extends Baza {
// Rescriere metoda numeMet()
public function numeMet() {
// Alte Instructiuni
}
}
?>
- Va genera eroarea:
Fatal error: Cannot override final method Baza::numeMet() in ...
- Deoarece metoda "numeMet()" este declarata cu atribut "final".
4. Clase fi nale
Precum metodele declarate cu "final" nu mai pot fi modificate in subclasa copil, asa se pot crea si clase care sa ramana fixe, fara sa se poata
crea din ele alta sub-clasa. Acest lucru se obtine prin adaugarea
cuvantului final inainte de class.
- De exemplu:
<?php
// Clasa Baza
final class Baza {
// ... Instructiuni
}
// Definire clasa-copil din Baza
class CopilBaza extends Baza {
// ... Alte Instructiuni
}
?>
- Va genera eroarea:
Fatal error: Class CopilBaza may not inherit from final class (Baza) in ...
Metode magice __get, __set, __call, __toString
In Programarea Orientata pe Obiecte (OOP) din PHP exista cateva
metode mai speciale, care incep cu "__" (doua caractere '_'),
precum __construct(). Acestea sunt numite generic Metode
Magice (Magic Methods) si se executa automat in situatii mai speciale,
cum ar fi de exemplu __get() pentru accesari de proprietati inexistente.
In aceasta lectie sunt prezentate cateva din cele mai folosite astfel de
metode: __get(), __set(), __call() si __toString().
- Toate aceste metode magice trebuie sa fie definite cu atribut public.
1. Metode __get si __set
Metodele magice: __get() si __set() se folosesc de obicei impreuna si
sunt create pentru lucru cu proprietati care nu sunt definite.
__get($name) - E apelata automat cand se acceseaza o proprietate care nu
exista. Preia numele ei in parametru $name.
__set($name, $value) - Se apeleaza automat cand se atribuie o valoare
unei proprietati care nu exista. Preia numele ei in parametru $name si
valoarea in parametru $value.
Iata un exemplu din care se intelege mai bine rolul lor. O clasa in care
sunt folosite aceste metode, se creaza o instanta de obiect la ea apoi e
accesata o proprietate inexistenta.
<?php
// Definire clasa AClas
class AClas {
// Proprietate care va retine valori atribuite unor proprietati nedeclarate
public $prop = array();
// Metoda magica __get() (pt. accesari proprietati nedefinite)
public function __get($name) {
// Daca exista element cu cheia '$name' in $prop, afiseaza valoarea lui
// Altfel, mesaj ca proprietatea nu exista
if(array_key_exists($name, $this->prop)) echo $this->prop[$name]. '<br />';
else echo 'Proprietatea <b>'. $name. '</b> nu exista.<br />';
}
// Metoda magica __set() (pt. cand se atribuie valori unor proprietati nedefinite)
public function __set($name, $value) {
// Adauga in $prop element cu cheia $name si valoarea value
$this->prop[$name] = $value;
echo 'Proprietatea <b>'. $name. '</b> nu exista. S-a atribuit valoarea <i>'.
$value. "</i> la proprietatea: <b>prop['$name']</b><br />";
}
}
// Creare instanta de obiect la clasa AClas
$obj = new AClas();
// Apelare proprietate neexistenta
$obj->noprop;
// Va determina executia metodei __get()
// Atribuire valoare la proprietate inexistenta
$obj->noprop = 'Valoare pt. noprop - PHP OOP';
metodei __set()
// Va determina executia
// Apelare din nou a aceleiasi proprietati neexistente
$obj->noprop;
// Va determina executia metodei __get()
// Se verifica direct si elementul pe care-l creaza __set()
echo 'Verificare: '. $obj->prop['noprop'];
?>
- $prop e definita ca tip Array ca sa stocheze, prin metoda __set(), valorile
atribuite unor proprietati nedefinite.
- Cand prin instanta de obiect la clasa e accesata o proprietate care nu
exista ($obj->noprop;), se executa automat metoda __get(). Aici e definita
sa verifice in $prop daca are element cu cheia $name (numele proprietatii
accesate), daca exista acel element, afiseaza valoarea lui, altfel, afiseaza
un mesaj.
- Cand se atribuie o valoare la proprietatea nedefinita ($obj->noprop =
'...';), se executa automat metoda __set(). Aici e definita sa adauge in
$prop un element cu numele proprietatii (cheie) si valoarea transmisa.
Vedeti si explicatiile din cod.
- Acest script va afisa urmatorul rezultat:
Proprietatea noprop nu exista.
Proprietatea noprop nu exista. S-a atribuit valoarea Valoare pt. noprop PHP OOP la proprietatea: prop['noprop']
Valoare pt. noprop - PHP OOP
Verificare: Valoare pt. noprop - PHP OOP
2. Metoda __call
Metoda magica __call() e creata pentru cazuri cand sunt apelate
metode inexistente. Sintaxa ei este:
__call($nume, $array_argumente)
- $nume reprezinta numele metodei apelate
- in $array_argumente sunt retinute intr-un Array argumentele adaugate
la apelarea metodei.
In urmatorul exemplu e definita o astfel de metoda "__call()" care afiseaza
un mesaj cu numele metodei inexistente care a fost apelata si
argumentele transmise.
<?php
// Definire clasa AClas
class AClas {
// Metoda magica __call() (pt. apelari metode nedefinite)
public function __call($name, $args) {
// Afiseaza un mesaj cu numele metodei apelate si argumentele transmise
echo 'Metoda <b>'. $name. '</b> nu exista. Argumente: <i>'. implode(', ',
$args). '</i>';
}
}
// Creare instanta de obiect la clasa AClas
$obj = new AClas();
// Apelare metoda inexistenta
$obj->site('cursuri', 'tutoriale');
?>
- In browser va afisa:
// Va determina executia metodei __call()
Metoda site nu exista. Argumente: cursuri, tutoriale
Incepand cu PHP 3.0 e adaugata o metoda similara, __callStatic(), aceasta se executa
automat cand e apelata o metoda statica nedeclarata, prin formula:
NumeClasa::metodaStatica()
3. Metoda __toString
Cu metoda __toString() se determina modul de reactie a clasei cand
instanta de obiect la ea este folosita ca o variabila de tip sir (String), de
exemplu cu "echo".
In urmatorul exemplu e definita o clasa cu o metoda __construct() si una
"__toString()" care afiseaza valoarea unei proprietati "mesaj".
<?php
// Definire clasa AClas
class AClas {
private $mesaj;
// Proprietate
// Metoda Constructor
public function __construct($mesaj) {
// Atribuie valoarea din parametru la proprietatea "mesaj"
$this->mesaj = $mesaj;
}
// Metoda magica __toString()
public function __toString() {
return $this->mesaj;
// Returneaza valoarea proprietatii "mesaj"
}
}
// Creare instanta de obiect la clasa AClas
$obj = new AClas('Fii bine primit');
// Apelare instanta, ca pe o variabila de tip String
echo $obj;
// Va determina executia metodei __toString()
?>
- In browser va afisa:
Fii bine primit
- Fara metoda __toString() adaugata in clasa, accesarea instantei de
obiect simpla, cu "echo" sau "print" genereaza o eroare de genul:
Catchable fatal error: Object of class AClas could not be converted to
string in ...
Mai sunt si alte metode magice, mai putin folosite, cum ar fi: __isset (se
apeleaza cand e verificata cu "isset()" o proprietate
inexistenta), __invoke (se executa cand instanta de obiect e apelata ca o
functie), si altele; le puteti gasi la pagina oficiala [Link] Metode Magice
OOP - Clase abstract si interface
Abstract si Interface (interfata) sunt tipuri de clase mai speciale
in OOP, pentru lucru mai avansat in programarea orientata pe obiecte.
1. Clase si Metode abstract
Clasele abstracte se declara folosind cuvantul abstract inaintea lui
"class".
La aceste tipuri de clase nu se poate crea instanta de obiect, ele pot fi
doar mostenite de alte clase extinse din ele.
In clasele abstracte se definesc si metode abstracte, acestea se
declara cu acelasi cuvant "abstract" si fara corpul de acolade, doar
numele si parantezele rotunde, cu parametri necesari.
- Iata un exemplu de clasa cu o proprietate "protected" o metoda
abstracta si una accesor:
<?php
// Definire clasa abstracta
abstract class Fructe {
protected $color;
// Proprietate
// Definire metoda abstracta
abstract function Stoc($luna);
// Metoda accesor pt. "color"
public function setColor($c) { $this->color = $c; }
}
?>
- Daca se creaza o instanta de obiect la aceasta clasa (de ex.: $obj = new
Fructe();), va genera eroare de genul:
Fatal error: Cannot instantiate abstract class
- Metodele abstracte se creaza doar in clase abstracte.
- Rolul claselor si metodelor abstracte este acela de a crea un model
minim de metode obligatorii care trebuie definite in sub-clase normale
derivate din ele (cu extends). Metodele abstracte definite in cea parinte
trebuie create in orice clasa copil extinsa din cea abstracta, cu acelasi
numar de parametri (numele poate fi difereit).
De ex., orice sub-clasa extinsa din clasa Fructe (definita mai sus) trebuie
sa contina metoda Stoc() cu un parametru, cum ar fi cea din urmatorul
exemplu, denumita Mere.
<?php
// Definire clasa copil, extinsa din cea abstracta
class Mere extends Fructe {
private $kg;
// Proprietate
// Metoda obligatorie (seteaza valoarea proprietatii "Kg")
public function Stoc($kg) {
$this->kg = $kg;
}
// Alta Metoda - optionala (returneaza valoarea proprietatii "kg")
public function getKg() {
return $this->kg. ' kg';
}
}
?>
- Deoarece clasa Mere extinde Fructe, trebuie sa contina, pe langa alte
elemente, si metodele abstracte declarate in aceea (anume Stoc(), cu un
parametru). Daca aceasta sub-clasa nu ar avea metoda Stoc(), va genera
eroare de genul:
Fatal error: Class Fructe contains 1 abstract method and must therefore
be declared abstract or implement the remaining methods (Mere::Stoc)
in...
- Sub-clasele care extind o clasa abstracta pot fi utilizate normal, se pot
crea si folosi instante de obiect la ele, mostenesc si pot folosi elementele
cu atribut "public" si "protected" din cea parinte.
De exemplu:
<?php
// Creare instanta de obiect la clasa Mere si apelare metode
$obj = new Mere();
$obj->Stoc(78);
echo $obj->getKg();
// Afiseaza: 78 kg
?>
2. Interfaces
Ca rol, se poate spune ca Interface este asemanatoare cu clasa
"abstract".
Clasa Interface este folosita ca tipar, sau template pentru clase cu
functii similare, care trebuie sa respecte o anumita structura de metode.
Sintetizat, Interface este o clasa cu o lista de metode obligatorii ce
trebuie sa fie create in clasele unde este implementata. Toate metodele
specificate in "Interface" sunt cu atribut public si trebuie sa fie definite
in clasele in care e aplicata, avand acelasi numar de parametri cati sunt
indicati in "Interface".
Creare interface
Clasa interface se creaza similar cu celelalte tipuri de clase. Diferenta
e aceea ca la definirea ei, in loc de cuvantul "class" se foloseste
cuvantul "interface"; in plus, in corpul ei se scrie doar o lista cu metode
publice fara, alt cod.
Sintaxa generala este urmatoarea:
interface numeInterfata {
public function numeMetoda();
public function altaMetoda()
...........
}
- La declararea metodelor in Interface nu se adauga acoladele sau codul
lor, si nici alt atribut diferit de "public".
Iata un exemplu cu o Interface, denumita "ITest", in care sunt definite 2
metode: "Links()" si "Tutoriale()".
<?php
// Definire Interface ITest
interface ITest {
// Lista cu metode
public function Links();
public function Tutoriale($str, $nota);
}
?>
Implementare interface
Dupa ce a fost definit tiparul "interface", se pot crea clase care
implementeaza metodele stabilite in acel tipar, respectand si numarul de
parametri.
Implementarea se face adaugand cuvantul implements si numele
Interfatei la definirea claselor, dupa numele lor.
class NumeClasa implements numeInterfata {
// Instructiuni
}
Acestea trebuie sa contina in corpul lor toate metodele definite in
"interface", cu atribut "public", si numarul de parametri stabiliti pt.
fiecare (numele la parametri poate fi diferit). Pe langa acestea pot
contine si alte metode.
Iata un exemplu cu o clasa care implementeaza interfata ITest creata mai
sus.
<?php
// Creare clasa care aplica Interfata ITest
class WebDevelopment implements ITest {
// Definire proprietate 'link' (cu atribut "protected")
protected $link = '[Link]';
/* Definire metodele obligatorii (Links si Tutoriale), din interface */
// Returneaza valoarea proprietatii 'site'
public function Links() {
return $this->link;
}
// Returneaza valoarea unei variabile din ea ($re), ce preia argumentele transmise
public function Tutoriale($gen, $nota) {
$re = $gen. '-'. $nota;
return $re;
}
// Se pot crea si alte metode, suplimentare
// Aceasta modifica valoare proprietatii "link"
public function setLink($link) {
$this->link = $link;
}
}
?>
- Metodele obligatorii (aici "Links()" si "Tutoriale()") respecta exact
numarul de parametri stabiliti in "interface" "ITest". Alte metode (aici
"setLink()") si proprietati sunt optionale, in functie de rolul fiecarei clase.
- Numele parametrilor nu conteaza (observati ca in loc de $str s-a folosit
$gen), dar numarul lor trebuie sa fie aceleasi ca in "interface".
- Daca vreuna din conditii nu ar fi respectata in clasa, cum ar fi:
nedefinirea unei metode, adaugarea de parametru in plus sau minus;
scriptul genereaza eroare.
Astfel, implementarea de "interface" este utila mai ales cand sunt create
mai multe clase cu roluri similare si dorim ca acestea sa aibe toate o
anumita ordonare si structura minima de metode, mai usor de retinut.
3. Interface ca tip de date
Interfata poate fi utilizata si ca tip de data la parametri de functii,
astfel, acel parametru poate fi utilizat ca instanta de obiect la orice clasa
din cele ce folosesc acea "interface".
Se intelege mai bine din urmatorul exemplu, in care e creata si folosita
inca o clasa (LimbiStraine) ce aplica Tiparul din "ITest"; contine o
proprietate si metodele obligatorii stabilite.
<?php
// Creare clasa care aplica Interfata ITest
class LimbiStraine implements ITest {
// Definire proprietate
protected $adr = '[Link]/';
/* Definire metodele obligatorii (Links si Tutoriale), din interface */
// Returneaza expresia 'Cale buna'
public function Links() {
return'Cale buna';
}
// Returneaza valoarea unei variabile din ea (re), ce preia argumentele "nr", "gen"
si proprietatea "adr"
public function Tutoriale($gen, $nr) {
$re = $nr.'-'. $this->adr. $gen;
return $re;
}
}
?>
Intr-un script PHP se scrie urmatorul cod:
<?php
// Se includ fisierele cu clasele create mai sus (daca sunt in fisiere externe): ITest
(Interfata), WebDevelopment si LimbiStraine
include('[Link]');
// Interface
include('[Link]');
include('[Link]');
// Creare functie care accepta doar argument cu obiect la clasele care au
implementata Interfata "ITest"
function cursuri(ITest $obj) {
// Apeleaza metodele comune (stabilite in ITest) prin parametru $obj
echo '<br />'. $obj->Links();
echo '<br />'. $obj->Tutoriale('php-mysql', 4);
}
// Creare instante de obiect la clasele folosite
$web_development = new WebDevelopment();
$limbi_straine = new LimbiStraine();
// Apeleaza functia cu instantele de obiect ale claselor ce au aplicat ITest
cursuri($web_development);
cursuri($limbi_straine);
// "[Link]" si "php-mysql-4"
// "Cale buna" si "[Link]/php-mysql"
?>
- Functia "cursuri()" creata cu aceasta formula intre acolade "function
cursuri(ITest $obj)" face ca ea sa accepte ca argument doar obiect care
are implementat "ITest".
- Observati ca apeland functia cu argumente diferite, reprezentand
numele instantelor la clase, foloseste parametru $obj ca instanta la clasa
respectiva, si poate apela aceleasi metodele ("Links()" si "Tutoriale()") pt.
fiecare deoarece aceste fiind specificate in "interface" ele trebuie sa
existe in fiecare clasa ce apartine acelei Interfate, cu acelasi numar de
parametri.
- Prin aceasta tehnica nu mai e nevoie de a crea aceeasi functie pt.
fiecare instanta.
Acest exemplu va afisa in browser urmatorul rezultat:
[Link]
php-mysql-4
Cale buna
[Link]/php-mysql
Functii cu Parametri object si array
In mod general, o functie se creaza cu sintaxa:
function nume_functie(parametri) {
// Instructiuni
}
- Datele din parametri pot fi de diferite tipuri: numere, siruri, matrice
(Array) sau chiar un obiect intreg. Pentru a verifica tipul de date primit la
parametri, se pot folosi functii PHP specifice, de tip "is_",
precum: is_string(), is_array(), is_object(), etc.
Pentru object si array exista si o alta varianta, specificarea tipului de
date permis o data cu parametru, cu formula:
function nume_functie(NumeClasa $parametru) { }
Sau pt. Array
function nume_functie(array $parametru1, array
$parametru2, ...) { }
- Aceste formule verifica si asigura ca datele din $parametru sa fie o
instanta de obiect la o anumita clasa, specificata la NumeClasa, sau, la
cealalta sintaxa, de tip array.
Pentru a intelege mai bine, studiati exemplu urmator si comentariile din
cod.
<?php
// Definire clasa AClas
class AClas {
public function aMet() {
return 'Metoda clasa AClas';
}
}
// Functie definita sa accepte doar instante de obiect ale clasei AClas (si sub-clase
ale ei)
function fCls(AClas $objPar) {
echo $objPar->aMet(). '<br />';
}
// Functie definita sa accepte doar date de tip Array
function fArr(array $arrPar1, array $arrPar2) {
print_r($arrPar1);
echo '<br />';
print_r( $arrPar2);
}
// Creare instanta de obiect la clasa AClas
$obj = new AClas();
fCls($obj);
// Apeleaza functia cu aceast obiect
// Definire variabile de tip Array si apelare cu ele functia fArr()
$arr1 = array('php', 'mysql', '[Link]');
$arr2 = array('cursuri', 'tutoriale');
fArr($arr1, $arr2);
?>
- Parametru $objPar al functiei fCls() reprezinta o instanta de obiect la
clasa AClas, astfel, prin el pot fi apelate metode si parametri din aceasta
clasa.
- Iar functia fArr() trebuie apelata cu doua argumente, ambele de tip
Array.
- In browser va afisa:
Metoda clasa AClas
Array ( [0] => php [1] => mysql [2] => [Link] )
Array ( [0] => cursuri [1] => tutoriale )
- Daca la apelarea functiei fCls(), in loc de o instanta de obiect la clasa
AClas se adauga alt tip de date la argument (sir, numar, obiect de alta
clasa, etc.), va genera eroare de genul:
Catchable fatal error: Argument 1 passed to fCls() must be an instance of
AClas, ...
Pe langa parametri object si array special definiti pot fi adaugati si parametri simpli.
De ex.:
function Functie(array $arr, $p2, $p3) { }
Metode de clasa, cu parametri object si array
Aceasta formula, cu specificarea tipului de parametri permisi (obiect la
o anume Clasa sau array), poate fi utilizata si la metodele din clase, care
sunt tot functii.
De exemplu, metoda "bObj()" din exemplu urmator accepta ca argument
doar instante de obiect ale clasei AClas si prin acesta poate apela
metoda "aMet()" din clasa AClas, iar metoda "bArr()" accepta doar date
de tip Array.
<?php
// Definire clasa AClas
class AClas {
public function aMet() {
return 'Metoda clasa AClas';
}
}
// Definire clasa BClas
class BClas {
// Metoda definita sa accepte la parametru $obj_par doar elemente ce apartin
unui obiect de clasa AClas
public function bObj(AClas $obj_par) {
return $obj_par->aMet();
// Returneaza apelul metodei aMet() din AClas
}
// Metoda definita sa accepte la parametru $arr_par doar date de tip Array
public function bArr(array $arr_par) {
print_r($arr_par);
}
}
// Afiseaza structura elementelor din $arr_par
// Creare instanta de obiect la clasa AClas
$objAC = new AClas();
// Creare instanta de obiect la clasa BClas
$objBC = new BClas();
// Apeleaza metoda bObj() din BClas cu instanta la AClas si cealalta cu un Array
echo $objBC->bObj($objAC). '<br />';
echo $objBC->bArr( array('cursuri', 'tutoriale') );
?>
- Explicatiile necesare sunt in cod.
- Scriptul va afisa urmatorul rezultat:
Metoda clasa AClas
Array ( [0] => cursuri [1] => tutoriale )
Inlantuire mai multe metode in PHP OOP
Inlantuire cu Metoda Statica
Aceasta lectie arata cum se pot accesa mai multe metode
inlantuite in PHP OOP.
Inlantuirea metodelor inseamna accesarea mai multor metode, sau
functii ale unei clase, intr-o singura instructune.
$obiect->metoda_1()->metoda_2()
Cerinta prin care se pot accesa metode inlantuite este ca metoda
precedenta sa returneze instanta de obiect, folosind: return $this in
codul metodei precedente (metoda_1() ).
- Iata un exemplu, o clasa PHP prin care se pot calcula aria si perimetrul
dreptunghiului (vedeti comentariile din cod si testati-l).
class Rectangle {
public $x = 0;
public $y = 0;
// seteaza valori pentru laturile $x si $y
public function setXY($x, $y){
$this->x = $x;
$this->y = $y;
return $this;
// returneaza instanta de obiect
}
// returneaza aria
public function area(){
return $this->x * $this->y;
}
// returneaza perimetru
public function perimeter(){
return 2 * ($this->x + $this->y);
}
}
// creaza o instanta de obiect a clasei
$obR = new Rectangle;
// afiseaza aria si perimetru
echo $obR->setXY(3, 4)->area();
// 12
echo '<br/>'. $obR->setXY(3, 4)->perimeter();
// 14
Se pot apela mai mult de doua metode inlantuite, tehnica e aceeasi,
toate metodele accesate precedent trebuie sa returneze instanta de
obiect.
- Iata un exemplu de inlantuire trei metode. O clasa PHP care defineste un
tag HTML, cu ID, atribut "class" si continut (studiati codul si testati-l).
class setTag {
private $id = '';
// atributul id
private $class = '';
// atributul class
// seteaza $id
public function setId($id){
$this->id = ' id="'. $id .'"';
return $this;
// returneaza instanta de obiect
}
// seteaza $class
public function setClass($class){
$this->class = ' class="'. $class .'"';
return $this;
// returneaza instanta de obiect
}
// returneaza tag-ul HTML si continutul
public function getTagCnt($tag, $cnt){
return '<'. $tag .$this->id. $this->class .'>'. $cnt .'</'. $tag. '>';
}
}
// creaza o instanta de obiect a clasei
$obTag = new setTag;
// variabile cu tipul tag-ului si continut
$tag = 'div';
$cnt = '[Link]
// apeleaza metodele inlantuite pt. setare ID, "class", creaza un <div> cu aceste
atribute si continut
echo $obTag->setId('some_id')->setClass('cls')->getTagCnt($tag, $cnt);
/* Rezultat:
<div id="some_id" class="cls">[Link]
*/
Instructiunea cu metodele inlantuite din codul de mai sus:
echo $obTag->setId('some_id')->setClass('cls')->getTagCnt($tag, $cnt);
E la fel cu acest cod:
// seteaza pe rand ID-ul, "class" si afiseaza tag-ul cu continutul
$obTag->setId('some_id');
$obTag->setClass('cls');
echo $obTag->getTagCnt($tag, $cnt);
Inlantuire cu Metoda Statica
Pentru a inlantui o metoda statica trebuie ca metoda statica sa
returneze instanta clasei, folosind: return new self.
In instructiunea de apelare a metodei statice se foloseste direct numele
clasei.
Sintaxa:
numeClasa::metodaStatica()->altaMetoda()
- Exemplu, o clasa PHP cu o metoda statica ce seteaza valoarea la o
proprietate statica privata (private nu poate fi accesat direct in afara
clasei), si o metoda publica ce returneaza valoarea proprietatii private.
<?php
class clsData {
// proprietate privata, nu poate fi accesata direct in afara clasei
private static $data;
// metoda statica, seteaza valoarea pt. $data
public static function setData(){
self::$data = '[Link]
return new self;
}
// returneaza instanta clasei
// metoda ce returneaza valoarea din $data
public function getData(){
return self::$data;
}
}
// acceseaza metoda getData() dupa /legat de setData()
echo clsData::setData()->getData();
// [Link]
PHP getElementById si getElementsByTagName
getElementsByTagName()
getElementById si getElementsByTagName sunt metode ale
clasei PHP DOMDocument . Aceste metode pot fi utilizate in PHP pentru a
lucra cu elemente /tag-uri HTML.
- Inainte de a utiliza metodele clasei PHP DOMDocument, trebuie sa
incarcati documentul HTML intr-un obiect DOMDocument, precum in
acest cod:
// creaza obiectul DOMDocument
$dochtml = new DOMDocument();
// incarca continutul dintr-o pagina (sau fisier) HTML
$dochtml->loadHTMLFile('[Link]');
// SAU, incarca elementele HTML stocate intr-un sir
$strhtml = '<html><body>Tag-uri si continut.<br></body></html>';
$dochtml->loadHTML($strhtml);
- Variabila $dochtml contine un obiect in care sunt toate elementele din
documentul HTML, intr-o structura ierarhica. Dupa ce e definit acest
obiect, se pot aplica la el metodele clasei DOMDocument ca sa accesati
elementele HTML (dupa cum puteti vedea in exemplele urmatoare).
- Este indicat sa aveti codul HTML corect format, altfel va genera erori
E_WARNING daca sunt gasite tag-uri sau atribute neinchise.
Pentru a traversa un obiect PHP, se foloseste instructiunea foreach().
getElementById
Functia getElementById('ID') returneaza un obiect ce contine elementul cu
ID-ul specificat, sau NULL daca elementul nu e gasit.
Aceasta functie este utila cand doriti sa preluati continutul, sau atributele
dintr-un element HTML cu un anumit ID.
- Proprietatea nodeValue se poate folosi pt a obtine continutul
elementului returnat de getElementById().
- Proprietatea tagName (sau nodeName) se poate folosi pt a obtine
numele tag-ului.
Exemplu, preia numele tag-ului si continutul unui element cu un anumit
ID:
<?php
$strhtml = '<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>PHP getElementById, getElementsByTagName</title>
</head>
<body>
<div id="dv1">[Link]</div>
</body></html>';
// creaza obiectul DOMDocument si incarca HTML dintr-un sir
$dochtml = new DOMDocument();
$dochtml->loadHTML($strhtml);
// preia elementul cu id="dv1"
$elm = $dochtml->getElementById('dv1');
// preia numele tag-ului si continutul
$tag = $elm->tagName;
$cnt = $elm->nodeValue;
echo $tag. ' - '. $cnt;
// div - [Link]
?>
getElementsByTagName
Functia getElementsByTagName('tag') returneaza un obiect cu toate
elementele cu acelasi nume de "tag". Argumentul special '*' preia toate
tag-urile.
Aceasta functie este utila cand doriti sa preluati continutul, sau atributele
mai multor elemente HTML cu acelasi <tag>.
- Metoda getAttribute('atribut') se foloseste pt a obtine valoarea
unui anumit atribut.
Exemplu, preia si afiseaza ID-ul si continutul fiecarui DIV:
<?php
$strhtml = '<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>PHP getElementById, getElementsByTagName</title>
</head>
<body>
<div id="cweb">[Link]</div>
<p>Curs gratuit PHP</p>
<div id="mp">[Link]</div>
</body></html>';
// creaza obiectul DOMDocument si incarca HTML dintr-un sir
$dochtml = new DOMDocument();
$dochtml->loadHTML($strhtml);
// preia toate DIV-urile
$divs = $dochtml->getElementsByTagName('div');
// parcurge obiectul cu toate DIV-urile
foreach($divs as $div) {
// preia si afiseaza ID-ul si continutul fiecarui DIV
$id = $div->getAttribute('id');
$cnt = $div->nodeValue;
echo $id. ' - '. $cnt. '<br/>';
}
?>
Rezultat:
cweb - [Link]
mp - [Link]
- Se poate folosi /incarca doar o parte din documentul HTML.
Exemplu 2. Incarca un sir ce contine doar sectiunea BODY, retine intr-un
Array continutul fiecarui paragraf (<p>) cu class="cls".
<?php
$strhtml = '<body>
<p class="cls">Curs gratuit PHP</p>
<p class="cls">URL: [Link]
<p>Paragraph without class.</p>
<div>[Link]</div>
<p class="cls">PHP getElementById si getElementsByTagName</p>
</body>';
// creaza obiectul DOMDocument si incarca HTML dintr-un sir
$dochtml = new DOMDocument();
$dochtml->loadHTML($strhtml);
// preia toate tag-urile <p>
$prgs = $dochtml->getElementsByTagName('p');
$pcls = array();
// parcurge obiectul cu toate paragrafele
foreach($prgs as $prg) {
// daca paragraful curent are class="cls", il adauga in array-ul $pcls
if($prg->getAttribute('class') == 'cls') {
$pcls[] = $prg->nodeValue;
}
}
// afiseaza array-ul $pcls
print_r($pcls);
// Array ([0] => Curs gratuit PHP [1] => URL: [Link] [2] =>
PHP getElementById si getElementsByTagName )
?>
Lucru cu atribute HTML in PHP
hasAttribute
setAttribute
removeAttribute
Clasa PHP DOMElement contine metode care pot fi utilizate pentru:
citire, setare si stergere atribute in documentul HTML incarcat in obiect
DOMDocument.
Pentru a traversa un obiect PHP, se foloseste instructiunea foreach().
getAttribute
Functia getAttribute('attr') returneaza valoarea atributului specificat, sau
un sir gol daca atributul "attr" nu e gasit.
- Aceasta metoda poate fi aplicata la un element HTML (sau XML) dintr-un
obiect DOMDocument.
- Se poate utiliza functia getElementsByTagName('tag') pt a prelua
toate elementele cu un anumit <tag>.
- Ca sa preluati elementul cu un anumit ID, se foloseste
metoda getElementById('ID').
Exemplu, obtine valoarea "href" din fiecare <a> din #menu:
<?php
// sir cu continut HTML
$strhtml = '<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>PHP getAttribute</title>
</head>
<body>
<ul id="menu">
<li><a href="[Link] title="Cursuri programare
web">[Link]</a></li>
<li><a href="[Link] title="Cursuri gratuite Jocuri
Anime">[Link]</a></li>
<li><a href="[Link] title="PHP Website">[Link]</a></li>
</ul>
</body></html>';
// creaza obiectul DOMDocument si incarca HTML din sir
$dochtml = new DOMDocument();
$dochtml->loadHTML($strhtml);
// preia elementul cu id="menu"
$menu = $dochtml->getElementById('menu');
// obtine toate tag-urile <a> din $menu
$atgs = $menu->getElementsByTagName('a');
// parcurge obiectul cu toate <a> in $menu
foreach($atgs as $atag) {
// afiseaza valoarea "href"
echo $atag->getAttribute('href'). '<br/>';
}
?>
Rezultat:
[Link]
[Link]
[Link]
hasAttribute
Functia hasAttribute('attr') returneaza TRUE daca atributul transmis
exista, altfel FALSE.
- Aceasta metoda e utila cand se doreste preluarea valorii unui anumit
atribut, pentru a evita erorile, verifica daca acel atribut exista.
- Se poate folosi /incarca si doar o parte din documentul HTML.
Exemplu. Incarca un sir ce contine doar sectiunea BODY, afiseaza ID-ul si
continutul DIV-urilor care au un atribut ID:
<?php
// sir cu continut HTML
$strhtml = '<body>
<div id="dv1">Curs gratuit PHP-MySQL.</div>
<div>Lucru cu atribute HTML in PHP.</div>
<div id="did">Resurse Web Development.</div>
</body>';
// creaza obiectul DOMDocument si incarca HTML din sir
$dochtml = new DOMDocument();
$dochtml->loadHTML($strhtml);
// obtine toate tag-urile DIV
$divs = $dochtml->getElementsByTagName('div');
// parcurge obiectul cu toate DIV-urile
foreach($divs as $div) {
// daca $div are ID, obtine si afiseaza ID-ul si continutul
if($div->hasAttribute('id')) {
$id = $div->getAttribute('id');
$cnt = $div->nodeValue;
echo $id. ' - '. $cnt. '<br/>';
}
}
?>
Rezultat:
dv1 - Curs gratuit PHP-MySQL.
did - Resurse Web Development.
setAttribute
Functia setAttribute('attr', 'value') seteaza valoarea "value" la atributul
"attr". Daca atributul nu exista, il creaza.
- Aceasta metoda e utila cand doriti sa creati un atribut intr-un tag, sau sa
dati alta valoare atributului respectiv.
- Cu metoda $doc->saveHTML() se poate adauga intr-un sir
continutul dintr-un nod DOMDocument cu HTML. De obicei e necesara
dupa efectuarea anumitor modificari in obiectul DOMDocument.
- Acest cod:
$dochtml->getElementsByTagName('body')->item(0)
returneaza un nod DOMDocument cu elementul <body>. Este util daca
doriti sa lucrati doar cu elementul <body> (incluzand tot continutul din
el), de exemplu pt a salva intr-un sir continutul BODY.
Exemplu, seteaza class="newcls" la toate paragrafele (<p>):
<?php
$strhtml = '<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>PHP setAttribute</title>
</head>
<body>
<p class="cls">Lectii gratuite PHP-MySQL.</p>
<p>URL: [Link]
<p>Resurse Web Development.</p>
</body></html>';
// creaza obiectul DOMDocument si incarca HTML din sir
$dochtml = new DOMDocument();
$dochtml->loadHTML($strhtml);
// obtine toate tag-urile <p>
$prgs = $dochtml->getElementsByTagName('p');
// parcurge obiectul cu toate paragrafele
foreach($prgs as $prg) {
// seteaza /creaza class="newcls" la fiecare <p>
$prg->setAttribute('class', 'newcls');
}
// obtine obiect cu elementul <body> (cu tot continutul din el)
$body = $dochtml->getElementsByTagName('body')->item(0);
// adauga continutul $body intr-un sir si-l afiseaza
$strbody = $dochtml->saveHTML($body);
echo $strbody;
?>
Rezultat:
<body>
<p class="newcls">Lectii gratuite PHP-MySQL.</p>
<p class="newcls">URL: [Link]
<p class="newcls">Resurse Web Development.</p>
</body>
removeAttribute
Functia removeAttribute('attr') sterge atributul "attr" din element.
Returneaza TRUE la succes, sau FALSE in caz de esec.
Exemplu, sterge atributul "class" din fiecare tag <p> cu class="cls":
<?php
// sir cu continut HTML
$strhtml = '<body>
<p class="cls">Lectii gratuite PHP-MySQL.</p>
<p class="othercls">Cursuri programare web.</p>
</body>';
// creaza obiectul DOMDocument si incarca HTML din sir
$dochtml = new DOMDocument();
$dochtml->loadHTML($strhtml);
// obtine toate tag-urile <p>
$prgs = $dochtml->getElementsByTagName('p');
// parcurge obiectul cu toate paragrafele
foreach($prgs as $prg) {
// daca elementul curent are class="cls", sterge atributul
if($prg->hasAttribute('class') && $prg->getAttribute('class') == 'cls') {
$prg->removeAttribute('class');
}
}
// obtine obiect cu elementul <body> (cu tot continutul din el)
$body = $dochtml->getElementsByTagName('body')->item(0);
// adauga continutul $body intr-un sir si-l afiseaza
$strbody = $dochtml->saveHTML($body);
echo $strbody;
?>
Rezulta:
<body>
<p>Lectii gratuite PHP-MySQL.</p>
<p class="othercls">Cursuri programare web.</p>
</body>
Documente XML
1. Despre XML
XML vine de la Extensible Markup Language. XML e o forma de SGML
(Standard Generalized Markup Language), pe scurt, acesta defineste o
sintaxa pentru structurarea datelor (un limbaj) pe care si omul si
calculatorul sa le poata citi.
Fiind un curs de PHP, explicatiile despre XML vor fi mai putine, scurte si
simple, cat e necesar pentru a se intelege ce e si cum poate fi utilizat cu
PHP.
Ca sa intelegeti cam ce este XML si ce se poate face cu el, ganditi-va ca
e similar cu HTML-ul, dar fara aspect grafic, in sensul ca structura
acestuia se formeaza pe baza unor tag-uri (elemente), precum <h1>,
<div>, etc. in HTML, si care pot contine atribute (sau identificatori), iar
in acelasi timp este o mini baza de date, deoarece scopul documentelor
XML e acela de a aranja si stoca date intr-o anumita ordine si structura
erarhica care sa poata fi citite si prelucrate de un alt limbaj, precum PHP.
Documentele XML pot fi create, scrise, folosind un editor simplu de
texte (precum Notepad).
Dupa cum puteti vedea in modelul de mai jos, un document XML e
asemanator cu unul HTML (daca stiti deja acest limbaj). Datele sunt
incadrate in niste tag-uri. Spre deosebire de HTML, in XML denumirea
tag-urilor (tehnic elemente) nu e stricta, putand fi folosite nume alese de
fiecare in functie de optiunea fiecaruia pentru recunoasterea datelor ce
vor fi scrise, care respecta cateva reguli minime.
Aceste reguli sunt:
Documentul XML trebuie sa inceapa cu sintaxa:
o <?xml version="1.0"?>
urmata de un element de baza (radacina) care va cuprinde toate celelalte
elemente (precum <html></html>), in exemplu de mai jos
<book></book>
Elementele trebuie sa aiba tag-uri de inchidere sau inchidere singulara (slash
la sfarsitul tag-ului: <... />) si sa fie ierarhice, astfel e corect: <x>
<y>...</y> </x> sau <x /> <y>...</y> (incorect <x> <y> </x> sau
<x> <y> </x> </y>)
Caracterele &, <, >, ', " sunt restrictionate in interiorul datelor, putand fi
folosite prin escapare, cu forma: &, <, >, ', "
XML este case-sensitive, astfel <tag> e diferit de <Tag>, de aceea e indicat
sa folositi litere mici la elemente si atribute pentru a evita confuzia.
- Exemplu de document XML:
<?xml version="1.0"?>
<book>
<publisher>Editura</publisher>
<title>Titlu carte</title>
<chapter title="Capitol carte">
<section title="Sub capitol">
<paragraph>
O fraza din sectiunea acestui sub-capitol.
</paragraph>
<paragraph>
Alta fraza din acelasi sub-capitol.
</paragraph>
</section>
</chapter>
</book>
- Acesta este o structura XML creata pentru stocarea ordonata a unor date
despre carti.
Datele astfel stocate (cum puteti vedea in exemplul de sus) pot fi
relativ usor citite si intelese de om (putand fi modificate simplu daca e
nevoie) dar si de un limbaj de programare (PHP, ASP) care le preia din
fisierul .xml, le prelucreaza si le poate aranja, manipula si transmite
catre o alta aplicatie, precum un navigator (browser) web.
In practica se folosesc de obicei pentru stocarea datelor baze de date
SQL, iar acest format XML este de preferat cand se doreste utilizarea
acestor date de catre mai mullti agenti, in general in scop de citire;
transmiterea fiind mai rapida si economica, de exemplu: Stiri, Meteo,
Clasamente, etc.
Aici apare rolul important al limbajului PHP, care, dupa ce a preluat
aceste date din fisierul .xml (ce poate fi pe alt server) le poate include
intr-o pagina HTML pentru a fi afisate in browser, sau introduce intro alta
baza de date mai mare.
PHP are functii speciale pentru citirea, recunoasterea si manipularea
datelor din format XML si chiar pentru crearea, scrierea de documente
XML (daca are permisiuni de scriere pe server). Vor fi aratate in
tutorialele (lectiile urmatoare.
2. Documente XML si DTD
Cerintele, criteriile, pentru scrierea unui document XML corect sunt
simple si minime. Totusi, un document XML valid si usor de inteles are
nevoie sa urmeze anumite reguli stabilite, cunoscute generic ca DTD
(Document Type Definition).
Ca sa intelegeti ce este si la ce e nevoie DTD, studiati urmatorul
exemplu in comparatie cu cel de sus.
<?xml version="1.0"?>
<book title="Nume carte">
<publisher name="Nume Editura"/>
<chapter number="8">
<chapter_title>Titlu capitol</chapter_title>
<p>
<sentence>O fraza din sectiunea acestui sub-capitol.</sentence>
<sentence>Alta fraza din acelasi sub-capitol.</sentence>
</p>
</chapter>
</book>
- La prima vedere pare similar, dar, desi datele esentiale transmise sunt
aceleasi, structura poate fi diferita. Se observa elemente cu alte denumiri
si adaugarea de atribute.
Pentru a folosi datele din documentele XML, trebuie sa le cunoasteti
structura aranjarii lor si forma ierarhica, astfel puteti adauga noi date (de
exemplu aici carti) care trebuie sa respecte acelasi format. Iar in cazul
unor documente mai mari, cu ierarhii mai multe, intelegerea lor devine
mai greoaie si va dura mai mult timp.
Aici intervine rolul DTD, o forma de explicare pe scurt a structurii aranjarii
datelor si relatia dintre ele. Adica, scrierea sub forma unei liste a
specificatiilor exacte despre cum sunt elementele legate intre ele, ce tip si
nume au fiecare si ce atribute sunt necesare.
De exemplu, pentru modelul de sus, daca cineva doreste sa-l foloseasca si
sa adauge noi carti, am putea scrie o descriere astfel:
Obiectul radacina al acestu document este "book"
"book" are doar un atribut "title"
"book" e compus direct din doua elemente: "publisher" si chapter"
"publisher" are doar un atribut "name"
"chapter" are un atribut "number" si doua elemente "chapter_title" si "p"
"p" poate contine mai multe elemente "sentence"
- Astfel, dand o copie a acestei liste oricui are nevoie de acest document
XML, va ajuta la intelegerea mai rapida si usoara a structurii datelor
pentru a le folosi sau adauga corect altele noi.
Se poate lucra in PHP cu datele din XML dupa ce a fost inteleasa structura
lor.
Setul de reguli DTD (Document Type Definition) poate fi specificat (scris)
direct in documentul XML (precum documentatiile in PHP), intr-un tag
special !DOCTYPE (document type declaration) si cu o sintaxa specifica.
Exemplu listei de sus este pentru intelegerea de catre alte persoane, dar
exista o sintaxa standard DTD care se adauga de obicei la inceputul
fisierului XML. Pentru obiectul acestui curs nu e nevoie de cunostinte mai
multe despre asta, vedeti totusi cum e in exemplul urmator.
Ca sa intelegeti cum se poate adauga setul de reguli standard DTD direct
in XML, vedeti exemplul urmator (partea scrisa ingrosat).
<?xml version="1.0"?>
<!DOCTYPE recipe [
<!ELEMENT
<!ATTLIST
<!ELEMENT
<!ELEMENT
<!ELEMENT
]>
recipe (ingredients, directions, servings)>
recipe name CDATA #REQUIRED>
ingredients (#PCDATA)>
directions (#PCDATA)>
servings (#PCDATA)>
<recipe name ="mancare">
<ingredients>Legume</ingredients>
<ingredients>Paine</ingredients>
<directions>Adauga la pachet</directions>
<servings>12</servings>
</recipe>
- Documentul XML e impartit in 3 sectiuni. Prima sectiune e linia standard
XML. A doua sectiune e setul intern de reguli DTD, marcat cu linii care
incep cu<!. A treia sectiune sunt datele XML.
Regulile interne DTD sunt scrise, incadrate de paranteze patrate in
interiorul <!DOCTYPE recipe [...]> (document type declaration),
'recipe" fiint obiectul (elementul) radacina.
Daca aveti mai multe documente cu aceeasi structura, se poate folosi un
singur DTD dintr-un fisier extern, decat in fiecare, mai usor de actualizat
in urma unei modificari.
Si in cazul utilizarii unui DTD extern, trebuie folosit !DOCTYPE care sa
precizeze locatia acestuia.
Iata 2 exemple, in primul, SYSTEM indica locatia pe server, iar in al doilea,
PUBLIC specifica un DTD standardizat (intalnnit si in documente HTML sau
XHTML):
<!DOCTYPE recipe SYSTEM "[Link]">
si
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"[Link]
In cazul aceluiasi DTD de mai sus, dar in fisier extern, "[Link]" ar
arata astfel:
<!ELEMENT
<!ATTLIST
<!ELEMENT
<!ELEMENT
<!ELEMENT
recipe (ingredients, directions, servings)>
recipe name CDATA #REQUIRED>
ingredients (#PCDATA)>
directions (#PCDATA)>
servings (#PCDATA)>
- Fara !DOCTYPE si paranteze patrate.
- Prin urmare, un document XML valid este acela care are un
format corect, respecta minimile reguli de sintaxa, dar contine si
un DTD.
Aceasta a fost partea teoretica, de scurta introducere in formatul XML, in
tutorialul urmatoar e prezentate aspectul practic si modul de lucru cu PHP.
Lucru cu XML - DOM
Pentru exemplele prezentate e nevoie de PHP 5+
1. Module de lucru cu XML
Pentru a prelucra in PHP datele dintr-un document XML trebuie ca
acesta sa aibe structura si sintaxa corecta comform standardului XML,
nu e nevoie sa fie strict valid, adica sa contina si DTD (vedeti explicatii
despre asta in lectia precedenta), dar indicat e sa fie si valid.
Sunt trei moduri (module) pentru lucrul cu XML: SimpleXML, DOM
(Document Object Model) si SAX (Simple API for XML); toate trei
sunt incluse in PHP. Fiecare are avantaje si minusuri, pot fi folosite
oricare din ele pentru a lucra cu datele din XML, pt. a crea, extinde si
modifica documente XML.
In continuare iata cate ceva, pe scurt, despre aceste module, dupa care
va fi explicat DOM, iar in lectia urmatoare si celelalte doua.
SAX
- SAX este mai usor de invatat, dar trateaza in esenta XML ca un sir de date.
Acest lucru face dificila adaugarea de noi elemente sau atribute, ori
modificarea unuia anume.
- SAX e util pt. lucruri repetitive ce pot fi aplicate tuturor elementelor de
acelasi tip. De exemplu, inlocuirea uni anumit element cu tag HTML pt. a
transforma XML in HTML.
DOM
- Extensiile PHP DOM citesc documentul XML si creaza pe baza acestuia, in
memorie, un obiect cu o structura ierarhica de tip arbore, incepand cu un
element (sau obiect) numit Nod (Node), elementele (obiectele) care sunt
cuprinse (incadrate) in acesta se numesc Copii (Children) ai acestui obiect,
iar elementele care-l cuprind (contin) pe el se numesc Parinti (Parents). Cu
functiile specifice DOM se poate obtine, modifica sau crea oricare din
aceasta ierarhie sau continutul, textul din ele. Apoi aceste date se pot folosi
independent, fiecare unde este necesar. Dezavantajul poate fi faptul ca
foloseste mai multe resurse, memorie.
DOM trebuie sa aibe in memorie tot arborele ierarhic inainte de a incepe
analiza documentului XML, fapt ce afecteaza procesarea documentelor XML
ce depasesc memoria alocata, dar se poate depasi aceasta limitare prin
folosirea unui spatiu de pe hard-disc ca memorie.
SimpleXML
- SimpleXML lucreaza cel mai bine pentru deschiderea si citirea rapida a
datelor unui document XML, converteste elementele si atributele din XML in
variabile native PHP (siruri, matrice) care pot fi utilizate dupa cum se face
normal cand sunt scrise in PHP.
- SimpleXML foloseste mai putina memorie decat DOM, economiseste resurse
si timp prin faptul ca necesita putine linii de cod, executa mai putine apelari
decat fac SAX si DOM. Minusul acestuia sunt unele probleme ce pot apare
cand e vorba de elemente imbricate mai adanc.
2. DOM XML
Document Object Model (DOM) e un modul complet pentru crearea,
editarea si manipularea datelor din documentele XML. Deoarece aceste
date sunt retinute in memorie sub forma de arbore ierarhic, e
recomandat ca documentul XML sa fie valid.
Fiecare element e transformat intr-un Obiect si e vazut ca un Nod ce
poate avea Continut, Parinti si Copii; incepand cu elementul radacina. La
randul lor, fiecare din acestia putand fi un Nod si interpretat ca un Obiect
separat, devenind totul o structura legata dar si individuala.
Aceasta structura poate fi modificata cu functii speciale (dintr-o librarie
de functii cum e "gnome-libxml2" care sunt implementate in PHP) si
rescrisa iar intr-un format XML.
Exemplu 1 - Creare document XML cu PHP
Pentru a intelege despre ce e vorba, vom lua un exemplu practic. Vom
crea cu PHP un document XML cat mai simplu, folosind functiile DOM XML.
Etapele de lucru sunt urmatoarele:
1. Se creaza in memorie un nou obiect XML.
2. Se creaza si adauga cateva elemente, un atribut si un continut text. Aici
alcatuim o structura cu tag-uri HTML
3. Se vor scrie (salva) datele intr-un fisier .xml (denumit "exemplu_dom.xml")
pe server (PHP trebuie sa aiba permisiuni de scriere pe server).
- Codul PHP pentru crearea acestuia este urmatorul. Explicatiile necesare
le gasiti in cod.
<?php
$doc = new DomDocument('1.0', 'utf-8');
creaza in memorie un nou obiect DOM
$root = $doc->createElement('html');
primul obiect element, radacina
$root = $doc->appendChild($root);
structura documentului, ca element
$body = $doc->createElement('body');
alt element, 'body'
$body = $root->appendChild($body);
'body' ca element copil in radacina
$body->setAttribute('bgcolor', '#e8e8fe');
un atribut pt. elementul doi (body)
$graff = $doc->createElement('p');
alt element, 'p'
$graff = $body->appendChild($graff);
'p' ca element copil in 'body'
$text = $doc->createTextNode('Un text pentru continut');
continut text
$text = $graff->appendChild($text);
continutul text in 'p'
// Se
// Se creaza
// Se adauga in
// Se creaza un
// Se adauga
// Se seteaza
// Se creaza un
// Se adauga
// Se creaza un
// Se adauga
// Salveaza, scrie datele create in obiectul $doc
// Afiseaza mesaj daca a putut salva fisierul pe server sau nu
if($doc->save("exemplu_dom.xml")) echo 'Documentul exemplu_dom.xml a fost
creat';
else echo 'Eroare: documentul exemplu_dom.xml nu a putut fi creat';
?>
- Copiati acest script intr-un fisier .php si apelati-l din browser, daca va
crea cu succes fisierul "exemplu_dom.xml" va afisa un mesaj afirmativ.
- Ca sa vedeti rezultatul, deschideti acest fisier cu un editor de text (sau
un browser).
Exemplu 2 - Modificare document XML cu PHP
Dupa ce e creat, sau aveti deja un document XML, poate apare
necesitatea de a modifica ceva la el, schimbarea continutului unui
element, adaugarea unui element nou, sau altele.
In urmatorul exemplu puteti invata cum se poate face cu PHP DOM cateva
modificari la datele dintr-un document XML si salvate in alt fisier .xml.
Va fi folosit documentul creat in primul exemplu, la care va fi modificat
continutul text din elementul (tag-ul) 'p' si va fi adaugat un alt element
'div' in acelasi parinte unde e si 'p'. Explicatiile necesare le gasiti in cod.
Etapele sunt urmatoarele:
1. Se creaza un nou obiect in memorie si se adauga in el datele dintr-un
document XML existent.
2. Se preia si parcurg elementele (care devin Nod-uri) din documentul
adaugat.
3. Cand parcurgerea ajunge la elementul caruia dorim sa-i adaugam un nou
continut text, adauga (modifica) pe cel existent, creaza un nou element cu
nume si text pe care-l adauga dupa cel modificat (in acelasi parinte)
<?php
$file = 'exemplu_dom.xml';
// Calea si numele fisierului .xml
$doc = new DOMDocument();
// Creaza un nou obiect in memorie
$doc->load($file);
// Incarca datele din $file in
obiectul nou creat
$get_elms = $doc->getElementsByTagName("*");
// Preia toate elementele
("*") stocate in obiect
$nr_elms = $get_elms->length;
// Obtine numarul de elemente
(Nodes) preluate
// Parcurge variabila cu obiectul ce stocheaza elementele (Nod-urile)
for($i = 0; $i<$nr_elms; $i++) {
$node = $get_elms->item($i);
// Preia fiecare Nod din
parcurgere
$element = $node->nodeName;
// Obtine numele elementului
// Daca elementul este 'p', ii adauga alt continut text
if($element=='p') {
$node->nodeValue = 'Un continut text nou';
// Creaza noul element dupa 'p' (in elementul Parinte unde se afla si
'p'), cu nume si continut text
$element_nou = $doc->createElement('div', 'Acesta este elementul nou
adaugat');
$node->parentNode->appendChild($element_nou);
// Adauga in
elementul parinte noul element creat
}
}
// Daca poate salva noul continut XML (din obiectul $doc) intr-un fisier .xml
// Preia continutul si intr-un sir (cu "saveXML()") pt. a afisa rezultatul
obtinut
if($doc->save('exemplu2_dom.xml')) {
echo htmlentities($doc->saveXML());
}
// Daca doriti rescrierea primului document XML, inlocuiti 'exemplu2_dom.xml'
cu numele aceluia
?>
- O lista cu mai multe functii utile in lucrul cu DOM si XML in PHP gasiti la
pagina -> Functii DOM XML
In tutorialul urmator este explicat utilizarea modulului SAX.
Lucru cu XML - SAX
SAX (Simple API for XML) este utilizat pe scara larga pentru a analiza
documente XML. E un API bazat pe evenimente. Functiile pentru aceste
evenimente nu sunt standard, ci sunt create de utilizator. Utilizatorul
creaza un numar de functii ce sunt apelate cand este recunoscut un
anumit eveniment.
Analiza documentelor XML cu SAX este unidirectionala. In timp ce
analiza parcurge datele XML, sunt recunoscute bucati din XML precum:
elemente, atribute, continut text, fiecare fiind un eveniment, iar datele
asociate unui eveniment sunt transmise la o functie creata de utilizator,
dupa ce functia termina operatiile analiza XML-ului continua. Datele care
au fost analizate anterior nu pot fi recitite decat incepand iar parsarea.
Avantajul principal fata de DOM este faptul ca SAX foloseste mai putina
memorie si procesarea datelor poate fi mai rapida.
DOM trebuie sa aibe in memorie tot arborele ierarhic inainte de a incepe
analiza documentului XML, fapt ce afecteaza procesarea documentelor
XML ce depasesc memoria alocata, (dar se poate depasi aceasta limitare
in cazul DOM prin folosirea unui spatiu de pe hard-disc ca memorie). In
schimb, cantitatea de memorie folosita de SAX depinde de adancimea
imbricarii elementelor si de cantitatea de date a atributelor dintr-un
element, ambele fiind mai mici decat marimea arborelui, ceea ce-l face o
alternativa mai buna in cazul documentelor XML mari dar cu adancime
de imbricare mai mica.
1. Utilizarea SAX
Utilizarea SAX depinde in general de scopul prelucrarii documentului
XML, deoarece utilizatorul scrie functiile necesare, dar sunt cativa pasi
comuni:
1. Determinarea evenimentelor care se doresc folosite.
2. Scrierea functiilor ce vor fi apelate pentru fiecare eveniment, de cele mai
multe ori pentru scrierea datelor, inceputul si sfarsitul unui eveniment.
3. Crearea unui parser folosind "xml_parser_create()" si apoi apelarea lui cu
"xml_parse()".
4. Eliberarea memoriei cu "xml_parser_free().".
Urmatorul exemplu arta modul de creare si utilizare a acestor functii de
baza. Ca model, va fi folosit urmatorul document XML, stocat intr-un fisier
"exemplu_sax.xml":
<?xml version="1.0" encoding="utf-8"?>
<carti>
<titlu titlul="Titlu Carte" id="1">
<autor nume="Nume Autor" />
<text>Un text din carte</text>
<pret suma="00" />
</titlu>
</carti>
- Cu functiile definite mai jos, vor fi prelucrarte si afisate numele,
atributele si continutul text din fiecare element al acxestui document
XML.
Documentatia din cod explica detaliat rolul si utilizarea fiecarei functii.
<?php
$file = "exemplu_sax.xml";
// Calea si numele fisierului XML
// Functie apelata la inceputul fiecarui element
// Pe langa $parser (analizatorul), $name e numele elementului
// $ar_attr e un array in care sunt stocate atributele din element
[nume]=>valoare
function startElement($parser, $name, $ar_attr) {
// Aici pot fi prelucrate matricea cu atributele ($ar_attr) si numele
elementului ($name)
echo "<b>$name -</b> ";
// Afiseaza numele elementului
// Daca matricea contine cel putin un atribut, o parcurge
if(count($ar_attr)>0) {
foreach($ar_attr as $atr=>$val) {
echo " $atr => $val ,";
// Preia si afiseaza numele si
valoarea fiecarui atribut
}
}
}
// Functie apelata la sfarsitul fiecarui element
// Pe langa $parser (analizatorul), $name stocheaza numele elementului (la
inchidere)
function endElement($parser, $name) {
// Aici, daca se mai doreste de facut ceva dupa ce a ajuns la inchiderea
elementului
print "\n";
}
// Functie apelata de fiecare data cand sunt intalnite caractere de date
(continut text) in element
// Pe langa $parser (analizatorul), $value stocheaza valoarea elementului
intalnit (continutul-text)
function characterData($parser, $value) {
// Aici pot fi manipulate datele din $value
echo "$value <br>";
// Afiseaza valoarea transmisa functiei
}
// Se defineste analizatoru care va fi apelat alaturi de functiile pentru
evenimente (definite mai sus)
// Pentru a utiliza standardul ISO-8859-1, se sterge parametru 'utf-8'
$simpleparser = xml_parser_create('utf-8');
// Daca se doreste anularea preluarii cu majuscule (se sterge // din fata
functiei)
// xml_parser_set_option($simpleparser, XML_OPTION_CASE_FOLDING, 0);
// Evenimentul care apeleaza functiile la inceputul si sfarsitul fiecarui
element
xml_set_element_handler($simpleparser, "startElement", "endElement");
// Eveniment ce apeleaza functia "characterData()" cand analiza ajunge la
continutul din element
xml_set_character_data_handler($simpleparser, "characterData");
// Deschide fisierul XML pentru citire
if($fo = fopen($file, "r")) {
// Preia continutul fisierului intr-un sir
while ($date_xml = fread($fo, filesize($file))) {
// Transmite datele la parser (analizator)
if (!xml_parse($simpleparser, $date_xml, feof($fo))) {
// Afiseaza eroarea aparuta daca analiza nu poate fi executata
echo xml_error_string(xml_get_error_code($simpleparser));
}
}
fclose($fo);
// Elibereaza memoria folosita pt deschiderea
fisierului
}
else echo "Nu a putut citi $file";
// Elibereaza memoria folosita la parsare
xml_parser_free($simpleparser);
?>
- Acest script va afisa urmatorul rezultat:
CARTI TITLU - TITLUL => Titlu Carte , ID => 1 ,
AUTOR - NUME => Nume Autor ,
TEXT - Un text din carte
PRET - SUMA => 00 ,
- Observati ca numele elementelor si atributelor sunt receptionate si
returnate de SAX cu majuscule. In mod initial, SAX foloseste aceste nume
cu majuscule iar formatul caracterelor e ISO-8859-1.
Pentru a anula preluarea cu majuscule si folosirea unui alt format (USASCII sau UTF-8) se poate utiliza functia "xml_parser_set_option()",
care preia ca prim argument parserul creat, apoi o
constanta: XML_OPTION_CASE_FOLDING sau XML_OPTION_TARGET_E
NCODING pentru format; al treilea argument este optiunea acelei
constante.
De exemplu, pentru anularea preluarii cu majuscule si utilizarea codingului UTF-8, se foloseste urmatorul cod la definirea analizatorului:
// Se defineste analizatoru
$simpleparser = xml_parser_create();
// Anuleaza preluarea cu majuscule si foloseste formatul UTF-8
xml_parser_set_option($simpleparser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($simpleparser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
- Pentru definirea formatului de codare, se poate specifica direct in
functia "xml_parser_create('utf-8')".
2. Functii SAX
Iata o lista cu cele mai importante functii SAX:
xml_parser_create([format]) - Creaza parser-ul (analizatorul), pot fi create
mai multe in acelasi script. Format e optional, 'utf-8' daca se doreste
acesta.
xml_parser_free(parser) - Elibereaza memoria folosita de parametru
"parser", care a fost creat cu "xml_parser_create()".
xml_parse(parser, "date_xml" [, final]) - Porneste analiza datelor XML, din
"date_xml", cu analizatorul "parser". Parametru trei, "final" e optinal,
precizeaza ultima bucata de date unde sa se termine analiza.
xml_get_error_code(parser) - Daca procesarea esueaza, aceasta functie
returneaza un cod de eroare din care se poate gasi cauza problemei.
xml_error_string(errorcode) - Returneaza un sir care specifica eroarea
gasita de "xml_get_error_code()", dat ca parametru.
xml_set_element_handler(parser, start_element_handler,
end_element_handler) - Aceasta functie seteaza evenimentele (functiile
definite de utilizator) ce trebuiesc apelate la inceputul, apoi inchiderea,
unui element.
xml_set_character_data_handler(parser, date_handler) - Seteaza
evenimentul cu functia ce trebuie apelata cand analiza ajunge la contextul
(continutul text) al elementului.
xml_set_default_handler(parser, handler) - Seteaza evenimentul
"default" care e apelat daca nu a fost definita o anume apelare pentru un
eveniment.
In tutorialul urmator este explicat utilizarea modulului SimpleXML.
PHP - XML - SimpleXML
SimpleXML a aparut in PHP 5. Lucreaza ca si DOM, cu obiecte, preia
tot documentul XML sub forma unui arbore ierarhic in memorie, dar spre
deosebire de acesta, e mai flexibil si foloseste mai putina memorie
deoarece elementele sunt stocate direct ca variabile PHP (de tip string si
array) si astfel pot fi imediat utilizate. Foloseste un minim necesar de
cod si are o forma intuitiva a datelor.
- In SimpleXML se lucreaza mult cu functii pentru Array,
majoritatea datelor sunt stocate in variabile de tip array.
Este util cand se doreste citirea catorva date dintr-un document XML, a
carui structura o cunoasteti, si scrierea altora inapoi.
Ca si in cazul DOM, este indicat ca documentul XML sa aibe un format
corect facut, cel mai bine, valid.
1. Citire document XML cu SimpleXML
La inceput se preia documentul XML dintr-un fisier
(cu simplexml_load_file().) sau dintr-un sir (cu simplexml_load_string())
care este imediat adaugat sub forma de obiect in memorie.
Apoi se face referire direct la oricare element din obiect, dupa cum
puteti vedea in exemplul de mai jos (trebuie sa stiti structura datelor
XML si elementele pe care doriti sa le folositi).
Ca model, va fi folosit urmatorul document XML, stocat intr-un fisier
"exemplu_simplexml.xml":
<?xml version="1.0" encoding="utf-8"?>
<carti>
<titlu titlul="Titlu Carte" id="1">
<autor nume="Nume Autor" />
<text>Un text din carte</text>
<text>Un alt paragraf din carte</text>
<pret suma="0" />
</titlu>
<titlu titlul="Titlu a doua carte" id="2">
<autor nume="Nume Autor carte 2" />
<text>Un text din a doua carte</text>
<text>Un alt paragraf din cea dea doua carte</text>
<pret suma="00" />
</titlu>
</carti>
- Urmatorul script preia si afisaza cateva date din acest document XML
(explicatiile necesare sunt in cod).
<?php
$obj = simplexml_load_file("exemplu_simplexml.xml");
numele fisierului .xml
$titlu = $obj->titlu;
"titlu" (intr-o variabila tip array)
$text = $obj->titlu[0]->text;
"text" din primul element "titlu"
// Calea si
// Preia toate elementele cu nume
// Preia toate elementele cu nume
// Parcurge matricea cu $titlu si preia intr-un array elementele "autor" si
"pret" din fiecare
for($i=0; $i<count($titlu); $i++) {
$autor[] = $titlu[$i]->autor;
$pret[] = $titlu[$i]->pret;
}
// Afiseaza valoarea atributului "nume" din primul element "autor"
echo $autor[0]['nume']. '<br>';
// Nume Autor
// Afiseaza valoarea atributului "suma" din al doilea element "pret"
echo $pret[1]['suma']. '<br>';
// 00
// Parcurge matricea $text (cu elementele "text" din primul "titlu")
// Afiseaza valoarea fiecaruia
for($i=0; $i<count($text); $i++) {
echo $text[$i]. ' - ';
din carte
}
?>
// Un text din carte - Un alt paragraf
- Testati singuri exemplul pentru a vedea rezultatul (folosind documentul
XML "exemplu_simplexml.xml").
2. Modifi care document XML cu SimpleXML
Pe langa a prelua si folosi date dintr-un document XML, cu SimpleXML
se poate si adauga date noi in acel document.
- Pentru a modifica valorile unor elemente sau atribute deja existente, se
identifica acel element (sau atribut - cheie in matricea elementului) in
sistemul ierarhic, si i-se atribue o noua valoare (vedeti metoda in
exemplu de mai jos).
Daca studiati si testati urmatorul exemplu, puteti intelege cum se
modifica document-ul XML (Scriptul va folosi acelasi fisier ca in primul
exemplu, "exemplu_simplexml.xml").
<?php
$obj = simplexml_load_file("exemplu_simplexml.xml");
numele fisierului .xml
$titlu = $obj->titlu;
"titlu" (intr-o variabila tip array)
// Calea si
// Preia toate elementele cu nume
// Parcurge matricea cu $titlu si adauga, cu "addChild()" inca un element in
fiecare, denumit "stoc", cu valoarea 1
for($i=0; $i<count($titlu); $i++) {
$titlu[$i]->addChild('stoc', 1);
}
// Modifica valoarea atributului 'nume' din elementul "autor" al primul
element "titlu"
$titlu[0]->autor['nume'] = 'Nume Modificat';
// Folosind sistemul de lucru cu array, creaza inca un element "autor" (fiind
al doilea cu acelasi nume, are indice [key] 1)
$titlu[0]->autor[1] = 'Alt autor';
// Tot cu sistemul de matrice, adauga in al doilea element "autor" inca o
cheie 'atribut', cu o valoare, care vor deveni atributul elementului
$titlu[0]->autor[1]['atribut'] = 'Atribut_adaugat';
// Adauga datele XML intr-un sir
$xml_doc = $obj->asXML();
echo htmlentities($xml_doc);
?>
// Afiseaza documentul XML rezultat
- O lista cu mai multe functii utile pentru lucrul cu SimpleXML gasiti la
pagina -> Functii SimpleXML
Utilizarea bazelor de date folosind PHP
Conectare la serverul MySQL folosind functiile PHP
Detectare erori aparute in lucrul cu bazele de date
Creare baze de date si tabele folosind functii PHP
Adaugare date in tebel folosind PHP
Faptul ca limbajul PHP a devenit atat de popular se datoreaza in mare
masura faptului ca acesta contine suport de functii pentru lucrul cu
bazele de date.
1. Conectarea la serverul MySQL
Pentru a utiliza o baza de date MySQL, avem nevoie de o conexiune la
serverul de baze de date. Aceasta conexiune va fi utilizata ca punct de
access pentru comenzi mysql.
Pentru a va conecta la un server MySQL, utilizati
functia mysql_connect(), a carei sintaxa este urmatoarea:
mysql_connect(nume_gazda, nume_utilizator, parola)
Unde "nume_gazda" este numele gazdei, serverul pe care ruleaza
serviciul MySQL, "nume_utilizator" este numele utilizatorului care se
conecteaza la serverul MySQL, iar "parola" este parola MySQL asociata
utilizatorului.
In cazul in care serverul MySQL ruleaza pe calculatorul dv. personal,
parametrul "nume gazda" este in general "localhost". In alte cazuri, daca
serverul MySQL ruleaza pe un alt computer, va trebui sa specificati
adresa computerului pe care ruleaza serverul MySQL.
Functia returneaza FALSE n caz de esec; n caz contrar, returneaza o
valoare denumita identificator de legatura, care serveste ca instrument
de manipulare pentru accesul la serverul MySQL.
Iata un exemplu de utilizare a functiei mysql_connect():
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
print "Connected to MySQL <br />";
?>
In acest exemplu, serverul MySQL ruleaza pe "localhost" ca si modulul
PHP, utilizatorul este "Marius" iar parola "mypass".
Dupa executia acestui script, daca nu se reuseste conectarea la MySQL,
va aparea mesajul "Unable to connect to MySQL", in caz de reusita, apare
mesajul "Connected to MySQL"
n mod prestabilit, functia mysql_connect() se conecteaza la serviciul MySQL prin
intermediul portului 3306, portul MySQL standard. Daca doriti sa obtineti accesul la un
server MySQL care ruleaza pe un port non-standard, puteti atasa un caracter doua puncte
si numarul portului dorit la argumentul care contine numele gazdei; de exemplu,
"localhost:3308".
2. Incheierea conexiunii la serverul MySQL
Pentru terminara unei conexiuni la serverul MySQL se foloseste
instructiunea: mysql_close();. Aceasta functie inchide conexiunea
curenta. Functia returneaza TRUE n caz de reusita; n caz contrar,
returneaza FALSE.
n general, nu este necesara invocarea functiei mysql_close(), deoarece
PHP nchide automat conexiunile deschise cu bazele de date atunci cnd
un script si ncheie executia.
Iata un exemplu de conectare la serverul MySQL si inchidere a conexiunii
folosind functia mysql_close():
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
// Aici adaugati datele necesare lucrului cu serverul MySQL
mysql_close();
?>
3. Detectarea aparitiei erorilor
Biblioteca MySQL din PHP furnizeaza doua functii de verificare a
erorilor, si anume mysql_errno() si mysql_error().
Fiecare functie returneaza un rezultat care reflecta eroarea, daca aceasts
exista.
Nici una din cele doua functii nu necesita argumente.
Functia mysql_errno() returneaza un cod numeric de eroare, n timp ce
functia mysql_error()returneaza un sir care descrie eroarea. Daca nu sa produs nici o eroare, codul numeric al erorii este zero si descrierea are
ca valoare un sir vid.
Informatiile de eroare sunt disponibile numai daca este activa o
conexiune cu serverul MySQL. Prin urmare, intai trebuie sa se reuseasca
conectarea la MySQL.
Iata cum puteti folosi functiile respective pentru a verifica modul de
operare a functiei mysql_select_db() (aceasta selecteaza baza de date
pentru lucru):
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
print "Connected to MySQL<br />";
mysql_select_db("lucrudb");
if (mysql_error()) {
echo "<br />". mysql_errno(). " : ". mysql_error();
}
?>
Daca se reuseste conexiunea la serverul MySQL si baza de date cu
numele "lucrudb" este inexistenta, rezultatul afisat de exemplul de mai
sus va fi urmatorul:
Connected to MySQL
1049 : Unknown database 'lucrudb'
4. Eliminarea mesajelor de eroare si a avertismentelor
nedorite
Numeroase functii PHP pot produce erori sau mesaje de avertizare care
i pot deruta pe utilizatorii siturilor Web sau le pot cauza neplaceri.
PHP furnizeaza functia error_reporting(), care va permite sa eliminari
mesajele nedorite. Functia are urmatoarea forma:
error_reporting(mask)
unde "mask" specifica tipul mesajelor care vor fi raportate. Daca
specificati zero ca valoare a atributului "mask" (error_reporting(0)), nu
va fi raportat nici un mesaj. Daca specificati "E_ALL" in loc de "mask"
(error_reporting(E_ALL)), vor fi raportate toate mesajele.
Sau, o alta metoda pentru oprirea mesajelor de eroare, explicata in
lectiile anterioare, este adaugand @ inaintea functiei.
4. Crearea si selectarea unei baze de date.
O functie importanta in lucrul cu bazele de date este mysql_query(),
care are urmatoarea forma:
mysql_query("interogare")
sau
mysql_query("interogare", "id_con")
- "interogare" este un sir ce contine comenzile SQL care urmeaza a fi
executate (in PHP, comenzile SQL nu trebuie sa se ncheie cu un caracter
punct si virgula).
- "id_con" este identificatorul de conectare returnat de
functia mysql_connect(), daca acesta este omis se foloseste ultima
legatura deschisa cu aceasta functie.
Functia mysql_query() returneaza TRUE daca serverul a reusit sa
execute interogarea; n caz contrar, returneaza FALSE.
- Important: pentru ca sa puteti lucra cu baze de date in PHP
trebuie sa cunoasteti comenzile SQL necesare. Cele mai
importante au fost prezentate in lectiile 22, 23 si 24
Pentru a crea o noua baza de date folosim comanda SQL "CREATE
DATABASE numeBazaDeDate;", pe care o putem lansa de la o consola
MySQL, sau o putem apela de la un script PHP prin intermediul
functiei mysql_query(). Iata un exemplu prin care creem baza de date
"lucrudb":
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$createdb = mysql_query("CREATE DATABASE lucrudb");
if ($createdb)
echo "Baza de date lucrudb a fost creata <br />";
else
echo "<br />". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
- Dupa executarea acestui script, daca totul este corect, va fi creata baza
de date "lucrudb" si va fi afisat mesajul "Baza de date lucrudb a fost
creata".
Dupa ce programul a obtinut o conexiune cu serverul MySQL, inainte de a
lucra cu tabelele dintr-o baza de date MySQL, programul trebuie sa
selecteze baza de date respectiva. Pentru aceasta, folositi
functia mysql_select_db(), care are urmatoarea forma:
mysql_select_db(baza_de_date)
Unde "baza_de_date" este numele bazei de date la care urmeaza a se
obtine acces.
Functia returneaza TRUE daca poate obtine accesul la baza de date,
respectiv FALSE n caz contrar.
Iata un exemplu de selectare a bazei de date "lucrudb":
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if ($selectdb)
echo "Baza de date lucrudb a fost selectata <br />";
else
echo "<br />". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
5. Crearea tabelelor
Dupa conectare si selectarea bazei de date putem crea tabele in cadrul
bazei de date selectate. Pentru aceasta folosim limbajul SQL CREATE
TABLE numeTabel (coloana1, coloana2, ...); impreuna cu
functia mysql_query().
In exemplul urmator cream tabelul cu numele "carti" care contine
urmatoarele campuri:
Nume
camp
id
nume
Tip
Identificator unic, Not Null, cheie
primara
Char(30)
autor
Char(25)
gen
Char(10)
data_intrare
pret
Date
Decimal(12,2)
In stanga, la "Nume Camp", sunt trecute coloanele tabelului, iar in
dreapta tipul acestora, coloana cu nume "id" fiind cheia primara.
De asemenea, folosim indicatorul "AUTO_INCREMENT" pentru a preciza
faptul ca MySQL va repartiza o valoare secventiala unica n coloana care
serveste drept cheie primara a tabelului.
Iata si scriptul PHP pentru creacrea tabelului:
<?php
$conn = mysql_connect("localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if (!$selectdb)
echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ".
mysql_error();
$sql = "CREATE TABLE `carti` (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, nume
varchar(30) NOT NULL, autor varchar(25) , gen varchar(10) NOT NULL, data_intrare
date, pret decimal(12,2))";
if (mysql_query($sql, $conn))
echo "Tabelul carti a fost creat <br />";
else
echo "Tabelul carti nu a putut fi creat deoarece : ". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
In exemplul de mai sus, variabila "$sql" contine comanda SQL pentru
crearea acestui tabel.
Instructiunea mysql_query($sql, $conn), executa aceasta comanda si
in cazul in care rezultatul este TRUE se trimite la iesire sirul: "Tabelul carti
a fost creat". In cazul in care instructiunea SQL nu a putut fi executata,
functia mysql_query($sql) intoarce valoarea FALSE, afisand eroarea din
cauza careia tabelul nu a putut fi creat.
6. Adaugarea de date in tabel
Dupa ce aveti tabelul creat in baza de date MySQL puteti adauga date
in el, pentru aceasta se foloseste
functia mysql_query("interogare") unde "interogare" este urmatoarea
comanda:
INSERT INTO `nume_tabel` (coloana1, coloana2, ...)
VALUES ('date1', 'date2', ...)
- unde `nume_tabel` este numele tabelului in care se adauga datele
- "coloana1, coloana2, ..." sunt numele coloanelor in care se doreste
adaugarea datelor
- "date1, date2, ..." sunt datele care vor fi adaugate, tinandu-se cont de
ordinea si numarul lor cu cea a coloanelor
Iata un exemplu, in care se foloseste tabelul "carti" creat mai sus
<?php
$conn = mysql_connect("localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if (!$selectdb)
echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ".
mysql_error();
$sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUES ('Glossa',
'Mihai Eminescu', 'poezie', '19-05-2009', '8')";
if (mysql_query($sql, $conn))
echo 'Datele au fost adaugate';
else
echo "Datele nu au fost adaugate deoarece : ". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
- In acest exemplu, datele "'Glossa', 'Mihai Eminescu', 'poezie', '19-052009', '8'" vor fi adaugate in coloanele "nume, autor, gen, data_intrare,
pret" in aceeasi ordine in care sunt scrise si datele si coloanele.
- Daca au fost adaugate cu succes, apare mesajul "Datele au fost
adaugate", in caz contrar apare mesajul de eroare.
Daca doriti sa adaugati mai multe linii in tabel, printr-o singura interogare,
puteti folosi urmatorul model
<?php
// Aici adaugati comenzile pt. conectare si selectarea bazei de date
$sql = "INSERT INTO `nume_tabel` (coloana1, coloana2, coloana3)
VALUES
('date1', 'date2', 'date3'),
('valoare1', 'valoare2', 'valoare3'),
('text1', 'text2', 'text3')";
if (mysql_query($sql))
echo 'Datele au fost adaugate';
else
echo "Datele nu au fost adaugate deoarece : ". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
Observati sintaxa de scriere corecta a interogarilor MySQL in PHP, numele tabelului se
scrie intre caracterele ( ` ` ) si valorile intre ghilimele simple ( ' ' )
Utilizarea bazelor de date folosind PHP (2)
Invatati sa verificati rezultatul interogarilor care nu returneaza randuri de
tabel
Invatati sa prelucrati rezultatele intergarilor SELECT
Invatati sa afisati randuri si coloane din tabel
1. Verifi carea interogarilor care nu returneaza rnduri de
tabel
Din punctul de vedere al limbajului PHP, exista doua categorii de
interogari SQL, ambele fiind emise folosind functia mysql_query().
Interogarile SELECT, care returneaza rnduri ale unui tabel
Interogarile UPDATE, INSERT si DELETE, care nu returneaza rnduri ale unui
tabel
Pentru a verifica daca o interogare UPDATE, INSERT sau DELETE a avut
efectul dorit, puteti folosi functia mysql_affected_rows(), care
returneaza numarul rndurilor afectate de interogarea cea mai recenta.
O alta functie utila este mysql_insert_id().
Cand introduceti un rand intr-un tabel a carui cheie primara este de tipul
AUTO_INCREMENT, functia mysql_insert_id() determina valoarea cheii
primare atribuite de MySQL. Functia returneaza valoarea zero daca
interogarea precedenta nu a generat o valoare AUTO_INCREMENT. Ca
atare, functia trebuie apelata la putin timp dupa interogarea care a
inserat rndul in tabel, astfel nct o alta interogare ulterioara sa nu
modifice rezultatul.
Iata un exemplu de utilizare a
functiilor mysql_affected_rows() si mysql_insert_id() impreuna cu
iterogarea INSERT (care adauga randuri in tabel). Folosim baza de date
"lucrudb" si tabelul "carti", create in Utilizare baze de date cu PHP.
<?php
$conn = mysql_connect("localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if (!$selectdb)
echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ".
mysql_error();
$sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUE ('Carte2',
'Autor2', 'Educativ', '2008-9-16', 11.00)";
if (mysql_query($sql))
echo "Datele au fost adaugate in tabelul carti <br />";
else
echo "Datele nu au fost adaugate in tabelul carti deoarece : ". mysql_errno(). " : ".
mysql_error();
$nranduri = mysql_affected_rows();
$id = mysql_insert_id();
if ($nranduri == -1) {
echo "INSERT nu a putut sa adauge datele";
}
else
echo "Au fost adaugate $nranduri randuri, cheia primara = $id" ;
mysql_close();
?>
Dupa ce s-a facut conectarea la serverul MySQL si s-a reusit selectarea
bazei de date, variabila "$sql" contine comanda SQL pentru introducerea
unui nou rand in tabelul "carti", prin intermediul
functiei mysql_query($sql) se introduce datele in baza de date, variabila
"$nranduri" preia de la functiamysql_affected_rows() numarul de
randuri afectate (aici introduse) iar variabila "$id" va avea (prin
"mysql_insert_id()") valoarea cheii primare atribuite de MySQL.
Daca nu apare nici o eroare, rezultatul afisat de acest script este
urmatorul:
Datele au fost adaugate in tabelul carti
Au fost adaugate 1 randuri, chea primara = 2
Functia mysql_insert_id() poate returna un rezultat incorect pentru
coloanele MySQL de tipul BIGINT
[BIGINT este un tip de valoare care suporta numere cu 20 de cifre,
folosit pentru campurile integer (spre deosebire de MEDIUMINT care
suporta numere de la 0 la 16.777.215 (3 bytes) sau INT care suporta
numerele de la 0 la [Link] (4 bytes)].
Dupa efectuarea unei interogari INSERT, In locul
functiei mysql_insert_id() se poate folosi functia LAST_INSERT_ID(),
aceasta returneaza valoarea atribuita de MySQL unei coloane
AUTO_INCREMENT, indiferent de tipul coloanei. Mai mult, apelurile
ulterioare in script la functii MySQL nu afecteaza rezultatul returnat
de LAST_INSERT_ID(), care este afectat numai de operatiile INSERT n
care sunt implicate coloane AUTO_INCREMENT.
Totusi, spre deosebire de
"mysql_insert_id()", LAST_INSERT_ID() necesita o interogare
suplimentara la MySQL.
Iata un exemplu care prezinta modul de obtinere a valorii LAST INSERT
ID():
<?php
$sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUE ('Carte3',
'Autor3', 'Gen3', '2008-9-16', 8.30)";
$insert = mysql_query($sql);
if (!$insert) {
echo "<br /> Cmanda INSERT a esuat: ". mysql_errno(). " : ". mysql_error(). "<br />";
}
$interogare = "SELECT LAST_INSERT_ID() FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$rand = mysql_fetch_row($rezultat);
echo "<br /> Ultimul ID repartizat: $rand[0]";
mysql_close();
?>
Dupa executarea acestui script, daca nu apare vreo eroare, rezultatul
afisat va fi de genul:
Ultimul ID repartizat: 3
Functia last_insert_id() returneaza rezultatul corect numai dupa ce a
fost efectuata o comanda INSERT.
Functia mysql_affected_rows() numara numai rndurile efectiv
modificate de catre o interogare UPDATE. Rndurile n cazul carora vechea
si noua valoare din coloana sunt identice nu se numara printre rndurile
afectate.
De asemenea, o interogare DELETE care nu contine o clauza WHERE va
determina functia mysql_affected_rows() sa returneze valoarea zero,
indiferent de numarul rndurilor sterse din tabel.
O modalitate simpla de a determina daca stergerea tuturor rndurilor
unui tabel a reusit consta n a emite o interogare care returneaza numarul
rndurilor existente n tabel. De exemplu:
<?php
$sql = "SELECT COUNT(*) FROM `carti`";
$result = mysql_query($sql);
$nr = mysql_fetch_row($result);
echo $nr[0];
?>
Daca interogarea returneaza valoarea zero, demonstreaza stergerea
tuturor rndurilor din tabel.
2. Prelucrarea rezultatelor interogarilor SELECT
Interogarile SELEC returneaza ca rezultate rnduri de tabel.
Rndurile unui tabel sunt incluse ntr-o structura de date numita "set de
rezultate". Prelucrarea setului de rezultate returnat de o interogare
SELECT implica parcurgerea rndurilor setului de rezultate.
O modalitate de parcurgere a rndurilor unui set de rezultate este prin
utilizarea unei instructiuni "WHILE".
1. Intai se verifica daca numarul de randuri returnat este 0 folosind
functia mysql_num_rows(), transferndu-i ca argument valoarea returnata
de functia mysql_query()
2. Daca numarul de randuri este 0 inseamna ca interogarea SELECT nu a
returnat nici un rand din tabel,
3. Daca numarul de randuri este diferit de 0, se executa o instructiune WHILE
impreuna cu una din functiile:
o mysql_fetch_assoc() (sau mysql_fetch_array() cu parametru
"MYSQL_ASSOC").
- sunt similare, adauga datele intr-o matrice asociativa
unde pentru fiecare element avem chei cu numele coloanelor iar
valoarile lor sunt datele din randul respectiv.
o mysql_fetch_row().
- adauga datele intr-o matrice asociativa unde pentru
fiecare element avem chei cu numere consecutive (incepand de
la 0) care reprezinta ordinea coloanelor iar valoarile lor sunt
datele din randul respectiv
o mysql_fetch_object().
- aduce rezultatele randului sub forma de obiect cu
perechile $rand->coloana
4. Pentru a prelucra coloanele stocate n matrice, depinde de functia folosita.
- pentru mysql_fetch_assoc() (sau mysql_fetch_array()) puteti folosi
o sintaxa de genul $rand['coloana']
- pentru mysql_fetch_row() puteti folosi o instructiune "foreach", prin
care parcurgeti datele din fiecare element a matricei
- pentru mysql_fetch_object() puteti folosi o sintaxa de genul $rand>'coloana'
- Aceste functii returneaza FALSE daca nu mai exista rnduri n setul de
rezultate
Ca sa intelegeti mai bine, voi arata cate un exemplu cu fiecare in parte
(voi folosi acelasi tabel, "carti"). Studiati-le cu atentie si exersati-le
singuri.
Nu s-au mai introdus in aceste exemple instructiunile pentru conectarea
la serverul MySQL si pentru selectarea bazei de date, le adaugati
dumneavoastra.
De exemplu, daca doriti sa aflati toate datele din anumite coloane puteti
folosi functia mysql_fetch_assoc() astfel:
<?php
$interogare = "SELECT `nume`, `autor` FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
echo '0 rezultate';
}
else {
while ($rand = mysql_fetch_assoc($rezultat)) {
echo '<br />'. $rand['nume']. ' - '. $rand['autor'];
}
}
?>
- Variabila "$rand" devine o matrice ale carei chei sunt numele coloanelor
iar valorile lor sunt datele coloanelor respective din randul curent;
instructiunea WHILE parcurge fiecare rand.
Iata acest exemplu, dar cu functia mysql_fetch_array(). In plus, in
interogare SQL voi adauga numele coloanelor prin variabile, ca sa vedeti
cum se lucreaza si cu variabile.
<?php
// Variabilele cu numele coloanelor
$col1 = 'nume';
$col2 = 'autor';
// Interogarea SQL folosind si variabile
$interogare = "SELECT `$col1`, `$col2` FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
echo '0 rezultate';
}
else {
while ($rand = mysql_fetch_array($rezultat, MYSQL_ASSOC)) {
echo '<br />'. $rand['nume']. ' - '. $rand['autor'];
}
}
?>
Cel de-al doilea argument al functiei mysql_fetch_array() este optional. Totusi, daca
nu specificati MYSQL_ASSOC ca valoare a argumentului, PHP returneaza un tablou in
care valoarea cheilor vor fi numerele si numele coloanelor.
- Comform datelor adaugate in tabelul "carti", aceste doua exemple vor
afisa urmatorul rezultat
Glossa - Mihai Eminescu
Carte2 - Autor2
Carte3 - Autor3
Daca doriti sa afisati toate datele din fiecare coloana de pe fiecare rand al
tabelului, puteti folosi functia mysql_fetch_row() astfel:
<?php
$interogare = "SELECT * FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
echo '0 rezultate';
}
else {
while ($rand = mysql_fetch_row($rezultat)) {
foreach ($rand as $coloana) {
echo "| $coloana |";
}
echo "<br />";
}
}
?>
- Exemplul de mai sus v-a afisa urmatorul rezultat, in functie de datele din
tabel:
| 1 || Glossa || Mihai Eminescu || poezie || 0000-00-00 || 8.00 |
| 2 || Carte2 || Autor2 || Educativ || 2008-09-16 || 11.00 |
| 3 || Carte3 || Autor3 || Gen3 || 2008-09-16 || 8.30 |
Daca doriti sa obtineti acces la valoarea unei anumite coloane, puteti face
referire la elementul din tablou folosind o cheie a tabloului.
De exemplu, daca rezultatul functiei mysql_fetch_row() este stocat n
variabila "$rand", puteti obtine acces la prima coloana folosind sintaxa
"$rand[0]", la a doua coloana folosind sintaxa "$rand[1]" etc.
Iata un exemplu in care este utilizata functia mysql_fetch_object(), iar
in interogarea SQL este adaugata si o conditie WHERE si o variabila "$nr".
<?php
$nr = 3;
$interogare = "SELECT `nume`, `autor` FROM `carti` WHERE `id`<'$nr'";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
echo '0 rezultate';
}
else {
while ($rand = mysql_fetch_object($rezultat)) {
echo '<br />'. $rand->nume. ' - '. $rand->autor;
}
}
?>
- Testati singuri pentru a vedea rezultatul.
Precizare: - Comform sintaxei MySQL cu PHP, numele tabelelor si coloanelor se scriu
intre caracterele ` ` (semnul din stanga tastei 1), desi functioneaza si fara, asa e corect,
comform standardului, si e necesar in cazul numelor de tabele /coloane formate din mai
multe cuvinte.
- Variabilele, cum e aici $nr se scriu intre ghilimele simple ' '
Lucrul cu baze de date MySQL, seturi de rezultate
Invatati sa obtineti date privind: numarul coloanelor, numele si lungimea
coloanelor dintr-un tabel MySQL
Invatati sa obtineti informatii privind indicatorii MySQL asociati coloanelor si
tipul fiecarei coloane
Invatati sa aflati numele tabelului care contine o anumita coloana si sa
parcurgeti non-secvential randurile unui tabel MySQL
Biblioteca de functii MySQL a limbajului PHP include functii care va
permit sa obtineti informatii despre un set de rezultate, inclusiv:
Numarul coloanelor din setul de rezultate
Numele fiecarei coloane
Lungimea fiecarei coloane
Indicatorii MySQL asociati coloanei
Tipul MySQL al fiecarei coloane
Numele tabelului MySQL care contine coloana
1. Obtinerea numarului coloanelor dintr-un tabel MySQL
Pentru a obtine numarul coloanelor dintr-un set de rezultate, utilizati
functia
mysql_num_fields()
Aceasta foloseste ca argument valoarea returnata de
functia mysql_query().
Iata un exemplu in care functia mysql_num_fields() determina numarul
coloanelor dintr-o interogare care selecteaza toate coloanele folosind
specificatorul SQL pentru toate cmpurile "*", astfel puteti afla numarul
de coloane dintr-un tabel:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$nr_campuri = mysql_num_fields($rezultat);
echo "<br /> Numar campuri: $nr_campuri";
mysql_close();
?>
2. Obtinerea numelui unei coloane
Pentru a obtine numele unei coloane dintr-un tabel MySQL, folositi
functia
mysql_field_name()
Aceasta returneaza numele coloanei din setul de rezultate. Functia preia
doua argumente: valoarea returnata de functia mysql_query() si indexul
coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0,
indexul asociat celei de-a doua coloane este l etc.
Iata un exemplu care determina numele primei coloane dintr-un tabel
MySQL:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$nume = mysql_field_name($rezultat, 0);
echo "<br /> Coloana 1 : $nume";
mysql_close();
?>
3. Obtinerea lungimii unei coloane
Pentru a obtine lungimea unei coloane dintr-un tabel MySQL, folositi
functia
mysql_field_len()
Aceasta returneaza lungimea maxima a coloanei din setul de rezultate.
Functia preia doua argumente: valoarea returnata de
functia mysql_query() si indexul coloanei care va fi descrisa. Indexul
asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane
este l etc.
Iata un exemplu care determina lungimea maxima a coloanei doi dintr-un
tabel MySQL:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$lungime = mysql_field_len($rezultat, 1);
echo "<br /> Lungime Coloana 2 - $lungime";
mysql_close();
?>
4. Obtinerea indicatorilor MySQL asociati unei coloane
Pentru a obtine indicatorii SQL asociati unei coloane dintr-un tabel
MySQL, folositi functia
mysql_field_flags()
Aceasta preia doua argumente: valoarea returnata de
functia mysql_query() si indexul coloanei care va fi descrisa. Indexul
asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane
este l etc.
Functia mysql_field_flags() raporteaza urmatorii indicatori:
AUTO_INCREMENT
BINARY
BLOB
ENUM
MULTIPLE_KEY
NOT_NULL
PRIMARY_KEY
TIMESTAMP
UNIQUE_KEY
UNSIGNED
ZEROFILL
- Daca la o coloana sunt asociati mai multi indicatori, fiecare indicator
este separat de vecinii sai prin intermediul unui singur spatiu.
Iata un exemplu care determina indicatorii asociati primei coloane dintrun tabel MySQL:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$indicatori = mysql_field_flags($rezultat, 0);
echo "<br /> Indicatorii Coloanei 1 : $indicatori";
mysql_close();
?>
5. Obtinerea tipului MySQL al unei coloane
Pentru a obtine tipul MySQL al unei coloane dintr-un tabel MySQL,
folositi functia
mysql_field_type()
Aceasta preia doua argumente: valoarea returnata de
functia mysql_query() si indexul coloanei care va fi descrisa. Indexul
asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane
este l etc.
Principalele tipuri MySQL returnate de functia mysql_field_type() sunt
prezentate in Baze de date SQL, in tabelul "Principalele tipuri de date din
MySQL".
Iata un exemplu care determina tipul primei coloane dintr-un tabel
MySQL:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$tip = mysql_field_type($rezultat, 0);
echo "<br /> Tip Coloana 1 : $tip";
mysql_close();
?>
6. Determinarea tabelului MySQL asociat unei coloane
Pentru a determina tabelul MySQL (daca exista) asociat unei anumite
coloane, folositi functia
mysql_field_table()
Aceasta preia doua argumente: valoarea returnata de
functia mysql_query() si indexul coloanei care va fi descrisa. Indexul
asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane
este l etc.
n cazul n care coloana contine o valoare calculata sau daca respectiva
coloana nu este asociata n alt mod cu un tabel MySQL, functia returneaza
un sir vid.
Iata un exemplu care determina tabelul asociat primei coloane din setul
de rezutate:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$tabel = mysql_field_table($rezultat, 0);
echo "<br /> Nume tabel : $tabel";
mysql_close();
?>
7. Obtinerea structurii complete a setului de rezultate
Daca doriti obtinerea mai multor caracteristici ale setului de rezultate,
o functie utila poate fi:
mysql_fetch_field()
Aceasta functie returneaza un obiect ale carui proprietati contin o
varietate de informatii cu privire la coloana unui tabel MySQL.
Proprietatile sunt urmatoarele:
blob - are valoarea 1 n cazul n care coloana este de tip BLOB
max_length - lungimea maxima a coloanei;
multiple_key - are valoarea 1 n cazul n care coloana este o cheie non-unica
name - numele coloanei
not_null - are valoarea 1 n cazul n care coloana nu poate contine valoarea
NULL
numeric - are valoarea 1 n cazul n care coloana este numerica
primary_key - are valoarea 1 n cazul n care coloana este o cheie primara
table - numele tabelului MySQL caruia i apartine coloana
type - tipul MySQL al coloanei
unique_key - are valoarea 1 n cazul n care coloana este o cheie unica
unsigned - are valoarea 1 n cazul n care coloana este de tip UNSIGNED
zerofill - are valoarea 1 n cazul n care coloana este completata cu zerouri
functia mysql_fetch_field() preia doua argumente: valoarea returnata de
functia mysql_query() si indexul coloanei care va fi descrisa. Indexul
asociat primei coloane este 0, indexul asociat celei de-a doua coloane
este l etc.
Iata un exemplu care prezinta modul de obtinere si descriere a structurii
complete a setului de rezultate pentru prima coloana dintr-un tabel
MySQL:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$info = mysql_fetch_field($rezultat, 0);
echo "<br /> Coloana 1: ";
echo "<PRE>
blob: $info->blob
max_length: $info->max_length
multiple_key: $info->multiple_key
name: $info->name
not_null: $info->not_null
numeric: $info->numeric
primary_key: $info->primary_key
table: $info->table
type: $info->type
unique_key: $info->unique_key
unsigned: $info->unsigned
zerofill: $info->zerofill
</PRE>";
mysql_close();
?>
Pentru a obtine aceste proprietati pentru toate coloanele din tabel, folositi
o instructiune "for", dupa exemplul de mai jos, care parcurge fiecare
coloana, folosind ca limita a numarului de coloane valoarea returnata de
functia mysql_num_fields()
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$nr_campuri = mysql_num_fields($rezultat);
for ($i=0; $i<$nr_campuri; $i++) {
echo "<br /> Coloana $i: ";
$info = mysql_fetch_field($rezultat);
if ($info) {
echo "<PRE>
blob: $info->blob
max_length: $info->max_length
multiple_key: $info->multiple_key
name: $info->name
not_null: $info->not_null
numeric: $info->numeric
primary_key: $info->primary_key
table: $info->table
type: $info->type
unique_key: $info->unique_key
unsigned: $info->unsigned
zerofill: $info->zerofill
</PRE>";
}
else {
echo "Necunoscut";
}
}
mysql_close();
?>
8. Accesul non-secvential la coloanele unui set de rezultate
Functiile mysql_fetch_row() si mysql_fetch_array() returneaza, n
general, rndurile dintr-un set de rezultate n mod secvential, incepand
de la primul rand al tabelului. Totusi,
functia mysql_data_seek() permite obtinerea accesului la rndurile
unui set de rezultate ntr-o maniera non-secventiala, . Functia are forma:
mysql_data_seek(rezultat, numar_rand)
Unde "rezultat" este valoarea returnata de functia mysql_query(), iar
"numar_rand" este indexul rndului la care doriti sa obtineti accesul.
Primul rnd al tabelului este numerotat cu 0, al doilea cu 1 etc.
Functia returneaza TRUE daca executia reuseste, respectiv FALSE n caz
contrar.
Apoi, o invocare ulterioara a functiei mysql_fetch_row() sau a
functiei mysql_fetch_array() va returna rndul din pozitia specificata in
functiamysql_data_seek().
Studiati urmatorul exemplu, care obtine accesul la al treilea rnd al
setului de rezultate returnat de o interogare anterioara:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (!mysql_data_seek($rezultat, 2)) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
else {
$rand = mysql_fetch_array($rezultat, MYSQL_ASSOC);
foreach ($rand as $coloana) {
echo "| $coloana |";
}
}
mysql_close();
?>
- Acest exemplu afiseaza datele din randul trei pentru fiecare coloana a
tabelului MySQL.