Documente Academic
Documente Profesional
Documente Cultură
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 MarPlo.net
// 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.
</body>
</html>
Salvati fisierul cu numele test-script.php
Daca ati instalat un server de PHP pe calculatorul dumneavoastra, salvati fisierul in directorul
www al serverului.
Deschideti browserul si scrieti adresa URL http://localhost/test-script.php
Daca nu aveti instalat un server de PHP pe calculator, incarcati (prin FTP) fisierul test-
script.php 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 http://www.marplo.net/ ca
adresa URL a catalogului care contine scripturile dumneavoastra PHP, puteti obtine accesul la
scriptul dumneavoastra prin intermediul adresei URL http://www.marplo.net/test-
script.php
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!
In browser va aparea:
Primul meu script PHP.
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.
• 2. 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 stânga
numarului. Evitati sa scrieti spatii sau virgule ca parte a unui întreg PHP.
Iata câteva 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 :-213 repectiv: 213. 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 pâna 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 câteva 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.
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 reprezentând 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
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);
?>
In browser va aparea:
boolean
integer
double
string
string
NULL
Observati ca utima linie afisata este NULL, asta deoarece $var6 nu are nici o valoare
determinata
$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 împartire este aceea ca returneaza o valoare
întreaga daca ambii sai operanzi sunt întregi si rezultatul este un întreg; în 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
împartire sunt ambii întregi.
Similar operatorului de împartire, operatorul modulo executa o împartire; cu toate acestea,
operatorul modulo returneaza restul, nu câtul împartirii. De exemplu, prin împartirea lui 10 la
3 se obtine câtul 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 în matematica, PHP evalueaza operatorii de înmultire si de împartire 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 înaintea celui de
înmultire. 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 între paranteze a expresiei este
evaluata prima, asa cum se procedeaza în algebra.
In afara de acesti operatori numerici, PHP include un operator de concatenare a sirurilor
(.), denumit uneori operator de unire, deoarece functia sa consta în 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
În 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 întregul imediat superior
• floor(x) - Returneaza valoarea 'x', rotunjita la întregul 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'
În afara de acestea, PHP include multe alte functii. Consultati site-ul www.php.net
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 în 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 în care argumentul functiei este inclus între paranteze, precum si modul în care
functia si argumentul sau sunt folosite într-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.
Nume:
Trmite formular
Bottom of Form
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 "test-form.php"
<?php
$nume = $_POST['nume'];
$email = $_POST['email'];
$parola = $_POST['parola'];
Nume:
Email:
Parola:
Trmite datele
Bottom of Form
Completam datele din formular, de exemplu: la Nume : Popescu, la Email : plomar@uv.ro si
Parola : parola_mea
Dupa ce am competat datele, apasam clic pe butonul "Trimite datele", acestea vor fi trimise la
scriptul PHP "test-form.php", care le va prelucra si va afisa urmatorul rezultat:
Nume = Popescu
E-mail = plomar@uv.ro
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 a 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:
• http://www.marplo.net/fisier.php?nume1=valoare1&nume2=valoare2
Exemplul include numai doua perechi "nume-valoare"; cu toate acestea, puteti include oricâte
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 "fisier.php") 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:
• http://www.marplo.net/script.php?autor=Mar+Plo
Unele dintre cele mai comune caractere speciale si echivalentele lor codificate URL sunt
prezentate în tabelul de mai jos:
Caracter special Echivalentul codificat 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
Î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.
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
întâmpla când î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.
Când 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 ramâne 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 cuvântul "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 fortata Rezultat
(int), (integer) - Conversie fortata la întreg
(real), (double),
- Conversie fortata la dublu
(float)
(string) - Conversie fortata la sir
- Conversie fortata la tablou
(array)
(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 de tip
floatval() dublu.
- Trateaza argumentul ca fiind de tip
intval()
întreg.
- Trateaza argumentul ca fiind de tip
strval()
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 când functia settype() 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.
1. empty($var)
- Returneaza TRUE daca variabila "$var" e considerata goala sau cu valoare vida, altfel,
FALSE. Functia "empty()" va returna TRUE, daca $var are una din urmatoarele valori: 0, "",
"0", NULL, FALSE, array().
<?php
$var = '0';
if (empty($var)) {
echo '$var are valoare nula sau zero';
}
?>
2. floatval($var)
- Returneaza valoarea float (numar cu zecimale) a lui "$var", care poate fi numar, ecuatie sau
sir. Similara este si functia "doubleval()".
<?php
$var = '123.456';
echo floatval($var); // 123.456
?>
3. get_defined_vars()
- Returneaza un array multidimensional ce contine o lista cu toate variabilele definite.
<?php
$arr = get_defined_vars();
print_r($arr["_POST"]); // Returneaza toate variabilele $_POST
?>
4. get_resource_type(resursa)
- Returneaza un sir cu tipul resursei din parametru.
<?php
$c = mysql_connect();
echo get_resource_type($c); // mysql link
5. gettype($var)
- Returneaza tipul variabilei "$var". Un sir cu unul din urmatoarele tipuri: boolean, integer,
double, string, array, object, resource, NULL, unknown type.
<?php
$var1 = 8;
echo gettype($var1); // integer
$var2 = "8";
echo gettype($var2); // string
$var3 = array(8=>'http://www.marplo.net');
echo gettype($var3); // array
$var4 = true;
echo gettype($var4); // boolean
?>
6. intval($var)
- Transforma valoarea variabile "$var" in numar natural.
<?php
$var1 = 8.9;
echo intval($var1); // 8
$var2 = "08";
echo intval($var2); // 8
$var3 = -7.8;
echo intval($var3); // -7
?>
7. is_array($var)
- Returneaza TRUE daca "$var" e o matrice (Array), in caz contrar, FALSE.
<?php
$lectii = array('http://www.marplo.net', 'php', 'html', 'css');
if (is_array($lectii)) {
echo '$lectii e o matrice';
}
?>
8. is_bool($var)
- Returneaza TRUE daca "$var" e de tip "boolean", in caz contrar, FALSE.
<?php
$var = true;
if (is_bool($var)) {
echo '$var e de tip boolean';
}
?>
9. is_float($var)
- Returneaza TRUE daca "$var" e un numar cu virgula (cu zecimale), in caz contrar, FALSE.
Acelasi rezultat il dau si functiile "is_double()" si "is_real()".
<?php
$nr = 78.9;
if (is_float($nr)) {
echo '$nr e un numar cu zecimale';
}
?>
10. is_int($var)
- Returneaza TRUE daca "$var" e un numar natural (fara zecimale), in caz contrar, FALSE.
Acelasi rezultat il dau si functiile "is_integer()" si "is_long()".
<?php
$nr = 78;
if (is_int($nr)) {
echo '$nr e un numar natural';
}
?>
11. is_null($var)
- Returneaza TRUE daca "$var" are valoarea nula, in caz contrar, FALSE.
<?php
$var = null;
if (is_null($var)) {
echo '$var are valoarea NULL';
}
?>
12. is_numeric($var)
- Returneaza TRUE daca "$var" e un numar (cu sau fara zecimale), in caz contrar, FALSE.
<?php
$nr = 078.9;
if (is_numeric($nr)) {
echo '$nr e un numar';
}
?>
13. is_object($var)
- Returneaza TRUE daca "$var" e o variabila de tip obiect, in caz contrar, FALSE.
<?php
// Se creaza o functie de lucru
function get_vars($obj) {
// Daca variabila $obj e un obiect, returneaza tipul de valori din ea
if (is_object($obj)) {
return var_dump($obj->get_vars);
}
else {
return '$obj nu e de tip obiect';
}
}
14. is_string($var)
- Returneaza TRUE daca "$var" e un sir, in caz contrar, FALSE.
<?php
$var = 'sir test';
if (is_string($var)) {
echo '$var e un sir';
}
?>
15. isset($var)
- Returneaza TRUE daca "$var" e setata (exista in domeniul de lucru, indiferent de valoarea
ei), in caz contrar, FALSE.
<?php
$v = '';
if (isset($v)) {
echo 'Variabila exista';
}
?>
16. print_r(array)
- Afiseaza un sir care prezinta cheile si elementele dintr-o matrice (array). Daca parametru
"array" e un sir sau numar, va afisa valoarea lui.
<?php
$aray = array('site'=>'www.marplo.net', 'php'=>'tutoriale');
print_r($aray); // Array ( [site] => www.marplo.net [php] => tutoriale )
17. serialize($var)
- Stocheaza valoarea /valorile variabilei "$var" intr-un sir. Variabila din parametru poate fi si
de tip Array sau Object. Aceasta functie este utila mai ales pentru stocarea ori transmiterea
datelor unei matrice sau obiect, mentinandu-le structura.
- In cazul obiectelor, se face "serialize" la instanta obiectului (vezi exemplul urmator, de la
"unserialize()"), si sunt salvate in sir variabilele si valorile lor dar nu si metodele (functiile), ci
doar numele lor.
<?php
$aray = array('site'=>'www.marplo.net', 'php'=>'tutoriale');
18. unserialize(sir)
- Creaza (Retransforma) la forma initiala structura unei variabile care a fost transformata in sir
cu "serialize()". Vezi si exemplul de mai sus.
<?php
// Se creaza o clasa simpla
class test {
public $nr = 8;
20. strval($var)
- Preia intr-un sir valoarea variabilei "$var".
<?php
$var = 7*8;
echo strval($var); // 56 (sir)
?>
21. unset($var)
- Distruge variabila "$var".
<?php
$aray = array('key'=>'test', 'php'=>'functii');
print_r($aray); // Array ( [key] => test [php] => functii )
// Distruge un element din matrice
unset($aray['key']);
print_r($aray); // Array ( [php] => functii )
?>
22. var_dump($var)
- Afiseaza informatii detaliate despre variabila din parametru, cum ar fi: tipul ei, numarul de
elemente si valoarea (valorile) din ea.
<?php
$aray = array('key'=>'test', 'php'=>'functii');
var_dump($aray); // array(2) { ["key"]=> string(4) "test" ["php"]=> string(7)
"functii" }
O instructiune corelata atât cu instructiunea if, cât si cu instructiunea else, este instructiunea
elseif. Când este folosita corect, poate fi mai simplu de înteles decât o instructiune if
imbricata, logic echivalenta cu aceasta.
Iata un exemplu de instrutiune elseif:
<?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, afisând 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.
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";
Un Array ale carui chei sunt valori întregi consecutive se numeste "Array secvential".
În general, valoarea cea mai mica a unei chei dintr-un tablou secvential este zero; totusi, puteti
crea un tablou secvential folosind 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 echo afiseaza 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 identitati cu Perl
Determinarea unei identitati cu PHP
PHP este un limbaj excelent.
Determinarea unei identitati cu Python
Instructiunea break
Observati ca parcurgerea continua chiar si dupa gasirea valorii cautate.
Când se cauta într-un tablou, executia cautarii poate fi oprita dupa gasirea elementului dorit;
continuarea parcurgerii in Array nu face decât 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 încât 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, determinând 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
1. array_change_key_case(array, case)
- Transforma cheile din primul parametru (array) in majuscule sau litere mici, dupa cum e
specificat la "case" (CASE_UPPER sau CASE_LOWER). Default e CASE_LOWER. Daca
"array" nu e o matrice, returneaza FALSE.
<?php
$aray = array("FirSt"=>1, "SecOnd"=>8);
print_r(array_change_key_case($aray, CASE_UPPER));
2. array_chunk(array, nr)
- Imparte "array" intr-un numar de sub-matrici, precizat la "nr", indexate de la 0. Daca "array"
nu are elemente, returneaza NULL.
<?php
$aray = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($aray, 2));
3. array_combine(array_k, array_v)
- Creaza un array folosind valorile din "array_k" pentru chei, iar elementele din "array_v"
pentru valorile lor. Numarul de elementele din cele 2 matrici trebuie sa fie egal, in caz contrar
returneaza FALSE.
<?php
$a = array('a', 'b', 'c');
$b = array('x', 'y', 'z');
$c = array_combine($a, $b);
print_r($c);
4. array_count_values(array)
- Returneaza o matrice cu numarul de repetari a fiecarui element din "array".
<?php
$aray = array('a', 8, 'a', 'b', 'a', 8, 'c');
$re = array_count_values($aray);
print_r($re);
// Return: Array ( [a] => 3 [8] => 2 [b] => 1 [c] => 1 )
?>
5. array_diff(array1, array2)
- Returneaza o matrice cu elementele din "array1" care nu se gasesc in "array2".
<?php
$aray1 = array("a"=>"green", "blue", "red");
$aray2 = array("b"=>"green", "yellow", "red");
$re = array_diff($aray1, $aray2);
print_r($re);
6. array_flip(array)
- Schimba valorile si cheile intre ele. Din valorile care se repeta o pastreaza pe ultima.
<?php
$aray = array("a"=>1, "b"=>2, "c"=>2);
$re = array_flip($aray);
print_r($re);
print_r($re);
8. array_key_exists(cheie, array)
- Returneaza TRUE daca "cheie" este o cheie (index) in matricea "array", in caz contrar
returneaza FALSE.
<?php
$aray = array("a"=>1, "b"=>'a', "mp"=>'d');
if (array_key_exists('mp', $aray)) {
echo 'Cheia exista';
}
?>
9. array_keys(array, val)
- Returneaza o matrice cu toate cheile din "array". Parametrul "val" e optional, daca e
specificat, va returna doar cheile cu valoarea "val".
<?php
$aray = array("a"=>1, "b"=>'c', 'd', "mp"=>'d');
$re = array_keys($aray);
print_r($re);
// Va afisa: Array ( [0] => a [1] => b [2] => 0 [3] => mp )
?>
print_r($aray);
12. array_pop(array)
- Elimina ultimul element din "array", care va fi transferat ca valoarea returnata de
"array_pop()". Daca parametru nu e matrice sau e gol, returneaza NULL.
<?php
$aray = array("a"=>1, 3, 4);
$re = array_pop($aray);
echo $re; // 4
?>
13. array_product(array)
- Returneaza produsul elementelor din "array"
<?php
$aray = array(1, 2, 3, 4);
echo array_product($aray); // 24
?>
15. array_reverse(array)
- Returneaza "array" cu ordinea elementelor inversata.
<?php
$aray = array(1, 2, 3, 'a', 'b'=>'c');
$re = array_reverse($aray);
print_r($re);
// Return: Array ( [b] => c [0] => a [1] => 3 [2] => 2 [3] => 1 )
?>
echo $re; b
?>
17. array_shift(array)
- Elimina primul element din "array", care va fi transferat ca valoarea returnata de
"array_shift()". Cheile vor fi renumerotate de la 0. Daca parametru nu e matrice sau e gol,
returneaza NULL.
<?php
$aray = array("a"=>1, 3, 4);
$re = array_shift($aray);
19. array_sum(array)
- Returneaza suma elementelor din "array"
<?php
$aray = array(1, 2, 3, 4);
echo array_sum($aray); // 10
?>
20. array_unique(array)
- Returneaza matricea "array" fara valorile duplicate, acestea fiind luate o singura data.
<?php
$aray = array(1, 2, 1, 4, 3, 4);
$aray = array_unique($aray); // $aray va avea: array(1, 2, 4, 3)
?>
21. array_values(array)
- Returneaza o matrice cu toate valorile din "array", ordonate numeric de la 0.
<?php
$aray = array("a"=>1, "b"=>'c', 'd', "mp"=>'d');
$re = array_values($aray);
print_r($re);
// Va afisa: Array ( [0] => 1 [1] => c [2] => d [3] => d )
?>
22. arsort(array)
- Sorteaza un "array" cu valorile ordonate in ordine inversa alfabetic, pastrand corelatia dintre
chei si valori. In caz de succes returneaza TRUE, altfel, FALSE.
<?php
$aray = array('c', "b"=>'xy', 'pm', "mp"=>'de');
arsort($aray);
24. count(array)
- Returneaza numarul de elemente din "array"
<?php
$aray = array('c', "b"=>'xy', 'pm', "mp"=>'de');
echo count($aray); // 4
?>
25. current(array);
- Returneaza valoarea elementului curent din "array", daca nu are elemente returneaza
FALSE. Fiecare matrice are un pointer intern, care prima data e setat la primul element.
<?php
$aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs');
echo current($aray); // php
?>
26. end(array);
- Muta pointerul din "array" la ultimul element si returneaza valoarea lui, daca nu are
elemente returneaza FALSE.
<?php
$aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs');
echo end($aray); // curs
?>
29. key(array)
- Returneaza cheia elementului curent la care se afla pointerul
<?php
$aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs');
end($aray); // Muta pointerul la ultimul element
echo key($aray); // mp
?>
30. krsort(array)
- Sorteaza un "array" dupa chei ordonate in ordine inversa alfabetic, pastrand corelatia dintre
chei si valori. In caz de succes returneaza TRUE, altfel, FALSE.
<?php
$aray = array('li'=>'php', "free"=>'tutorial', 'mysql', "mp"=>'curs');
krsort($aray);
31. ksort(array)
- Sorteaza un "array" dupa chei ordonate in ordine alfabetica, pastrand corelatia dintre chei si
valori. In caz de succes returneaza TRUE, altfel, FALSE.
<?php
$aray = array('li'=>'php', "free"=>'tutorial', 'mysql', "mp"=>'curs');
ksort($aray);
32. natcasesort(array)
- Sorteaza un "array" in ordine alfabetica a valorilor, case-insensitive, folosind ordinea
naturala a numerelor. In caz de succes returneaza TRUE, altfel, FALSE.
<?php
$aray = array('li'=>'Php', "free"=>'tutorial', 'MySQL', "mp"=>'curs');
natcasesort($aray);
33. next(array);
- Avanseaza pointerul din "array" inainte cu un element si returneaza valoarea, daca nu are
elemente returneaza FALSE.
<?php
$aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs');
echo next($aray); // tutorial
?>
34. prev(array);
- Muta pointerul din "array" inapoi cu un element si returneaza valoarea, daca nu are elemente
returneaza FALSE.
<?php
$aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs');
end($aray); // Duce pointerul la ultimul element
echo prev($aray); // mysql
?>
35. reset(array);
- Readuce pointerul din "array" la primul element si returneaza valoarea lui, daca nu are
elemente returneaza FALSE.
<?php
$aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs');
next($aray); // Avanseaza pointerul cu un element
echo reset($aray); // php
?>
36. rsort(array)
- Sorteaza un "array" in ordine inversa alfabetic a valorilor (literele mici inaintea celor mari),
stergand cheile initiale, devenind un Array asociativ cu chei de la 0. In caz de succes
returneaza TRUE, altfel, FALSE.
<?php
$aray = array('li'=>'Php', "free"=>'tutoriale', 'MySQL', "mp"=>'curs');
rsort($aray);
37. sort(array)
- Sorteaza un "array" in ordine alfabetica a valorilor (literele mari inaintea celor mici),
stergand cheile initiale, devenind un Array asociativ cu chei de la 0. In caz de succes
returneaza TRUE, altfel, FALSE.
<?php
$aray = array('li'=>'Php', "free"=>'tutoriale', 'MySQL', "mp"=>'curs');
rsort($aray);
38. shuffle(array)
- Amesteca aleator elementele din "array". Sterge cheile initiale, devenind un Array asociativ
cu chei de la 0. In caz de succes returneaza TRUE, altfel, FALSE.
<?php
$aray = array('li'=>'Php', "free"=>'tutoriale', 'MySQL', "mp"=>'curs');
shuffle($aray); // $aray va avea elementele amestecate aleator
?>
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
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");
Functie Operatia efectuata Rezultat
0 => PHP
- Sortarea unui tablou în functie de valoare, in ordine alfabetica, fara sa se tina
sort() 1 => Perl
cont de cheile initiale
2 => Python
20 => PHP
- Sortarea unui tablou în functie de valoare, in ordine alfabetica, pastrand
asort() 10 => Perl
corelarea initiala dintre valori si cheile corespunzatoare
21 => Python
0 => Python
- Sortarea unui tablou în functie de valoare, in ordine invers alfabetica, fara sa
rsort 1 => Perl
se tina cont de cheile initiale
2 => PHP
21 => Python
- Sortarea unui tablou în functie de valoare, in ordine invers alfabetica, pastrand
arsort 10 => Perl
corelarea initiala dintre valori si cheile corespunzatoare
20 => PHP
10 => Perl
ksort - Sortarea unui tablou în functie de cheie, in ordine ascendenta 20 => PHP
21 => Python
21 => Python
krsort - Sortarea unui tablou în functie de cheie, in ordine descendenta 20 => PHP
10 => Perl
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 decât al doilea, zero daca sirurile sunt identice, respectiv o valoare pozitiva daca
primul sir este mai mare decât 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 www.php.net
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 = 0 Valoare = Popescu
Cheie = 1 Valoare = Avram
Cheie = 2 Valoare = Cristian
Cheie = 3 Valoare = 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"
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, reprezentând 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;
Când 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
http://www.domeniu.site/script.php?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 fisierelor 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")
Când 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 "antet.php") 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("antet.php");
?>
- cu aceasta determinati programul PHP sa includa continutul fisierului "antet.php" 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
require pentru a include continutul altor fisiere externe, puteti gasi instructiunea
require_once utila.
3. Definirea 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
}
Cuvântul 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 când 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 definite 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 cuvântul "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. Definirea 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
1. abs(nr)
- Returneaza valoarea absoluta (cu +) a lui "nr".
<?php
echo abs(-7.8); // 7.8 (double /float)
echo abs(3); // 3 (integer)
echo abs(-5); // 5 (integer)
?>
3. bindec('sir_binar')
- Returneaza echivalentul numeric (decimal) al sirului binar din parametrul "sir_binar".
<?php
echo bindec('10010'); // 18
echo bindec('1000'); // 8
?>
4. ceil(nr)
- Returneaza valoarea rotunjita a lui "nr" la urmatorul (mai mare) intreg.
<?php
echo ceil(7.8); // 8
echo ceil(5); // 5
echo ceil(-2.3); // -2
echo ceil(1.2); // 2
?>
5. cos(radian)
- Returneaza valoarea cosinus a gradelor de cerc specificate la "radian".
<?php
echo cos(30); // 0.15425144988758
echo cos(90); // -0.44807361612917
?>
6. decbin(nr)
- Returneaza un sir cu valoarea binara a numarului "nr".
<?php
echo decbin(-5); // 11111111111111111111111111111011
echo decbin(88); // 1011000
?>
7. dechex(nr)
- Returneaza un sir cu valoarea hexazecimala a numarului "nr".
<?php
echo decbin(-5); // fffffffb
echo decbin(88); // 58
?>
8. decoct(nr)
- Returneaza un sir cu valoarea octala a numarului "nr".
<?php
echo decbin(-5); // 37777777773
echo decbin(88); // 130
?>
9. floor(nr)
- Returneaza valoarea rotunjita a lui "nr" la anteriorul (mai mic) intreg.
<?php
echo floor(7.8); // 7
echo floor(5); // 5
echo floor(-2.5); // -3
echo floor(1.2); // 1
?>
10. fmod(x, y)
- Returneaza valoarea ramasa a lui "x" impartit la "y", care nu mai e multiplu de "y".
<?php
$x = 8.5;
$y = 3;
$r = fmod($x, $y); // $r va avea valoarea 2.5 (2 * 3 + 2.5 = 8.5)
?>
11. hexdec('hex')
- Returneaza valoarea zecimala a sirului hexazecimal "hex".
<?php
echo hexdec('ee'); // 238
echo hexdec('3fe'); // 1022
?>
13. is_infinite(val)
- Returneaza TRUE daca valoarea lui "val" este un numar infinit (precum log(0)), altfel,
returneaza FALSE.
<?php
$nr = log(0);
if (is_infinite($nr)) echo 'Nr. infinit';
?>
14. lcg_value()
- Returneaza un numar aleator intre 0 si 1.
<?php
echo lcg_value(); // 0.64820835969476
?>
15. log10(nr)
- Returneaza logaritmul in baza 10 a lui "nr"..
<?php
echo log10(1000); // 3
?>
20. octdec('oct')
- Returneaza valoarea zecimala a sirului octal "oct".
<?php
echo octdec('42'); // 34
?>
21. pi()
- Returneaza valoarea aproximativa a lui PI. La fel ca si constanta M_PI.
<?php
echo pi(); // 3.1415926535898
echo M_PI; // 3.1415926535898
?>
23. round(nr)
- Returneaza valoarea rotunjita a lui numar la intregul ce mai apropiat.
<?php
echo round(7.8); // 8
echo round(5); // 5
echo round(-2.5); // -3
echo round(1.2); // 1
?>
24. sin(radian)
- Returneaza valoarea sinus a gradelor de cerc specificate la "radian".
<?php
echo sin(30); // -0.98803162409286
echo sin(90); // 0.89399666360056
?>
25. sqrt(nr)
- Returneaza radical din "nr".
<?php
echo sqrt(225); // 15
?>
26. tan(radian)
- Returneaza valoarea tangenta a gradelor de cerc specificate la "radian".
<?php
echo tan(30); // -6.4053311966463
echo tan(90); // -1.9952004122082
?>
27. is_numeric(val)
- Returneaza TRUE daca "val" e o valoare numerica, altfel, FALSE.
<?php
$x = 32/3;
if (is_numeric($x)) echo "E un numar si are valoarea: $x"; // E un numar si are
valoarea: 10.666666666667
?>
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=1
x=1
x=1
x=1
x=2
x=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 când 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,
specificând ca argumentul sa fie transferat prin referinta.
Când 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()", transferând 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 php.ini, daca
aveti acces, prin setarea 'true' la "allow_call_time_pass_reference".
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 pâna 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 stânga 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 stânga.
• 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 stânga 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 decât double (float).
• Specificator de tip (obligatoriu): - Specificatorul de tip determina modul de tratare si
afisare a argumentului.
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
$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
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 sfârsitul 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 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 deprecate incepand cu versiunea PHP 5.3 si anulate din
PHP 6, 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 manualul Expresii 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);
$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 fisier
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 câte 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 emitând 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. Modificarea privilegiilor unui fisier
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 "text.txt" privilegiile "rwxr-xr--" specificând pentru
'mod' valoarea 0754, functia "chmod" va fi chmod("text.txt", 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 fisier
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 'carte.txt' pentru citire:
• $fh = fopen("carte.txt", "r");
Sub Microsoft Windows, fisierele ASCII si fisierele binare sunt tratate în mod diferit. Când
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. Verificarea finalizarii unei operatii cu un fisier
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("carte.txt", "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
?>
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("carte.txt", "rb"))
OR die("Nu a fost deschis fisierul carte.txt.");
?>
6. Inchiderea unui fisier
Un fisier deschis consuma resursele sistemului. Când un script a terminat de utilizat un fisier,
scriptul trebuie sa închida fisierul, eliberând aceste resurse.
La sfârsitul unui script, PHP închide în mod automat fisierele deschise. Totusi, la programare
se recomanda sa închideti fisierele mai rapid, ori de câte 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("carte.txt", "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
// 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.
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("carte.txt");
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. Afisarea continutului unui fisier
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("carte.txt", "rb");
fpassthru($fh);
Dupa ce a afisat fisierul, functia îl închide automat.
- Cealalta functie, readfile(), necesita numai numele sau calea fisierului:
• readfile("carte.txt");
5. Navigarea printr-un fisier
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 = "carte.txt";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Fisieru carte.txt 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 atât de frecventa.
Functia fseek() furnizeaza o mai mare flexibilitate, permitându-va sa pozitionari pointerul de
fisier astfel încât 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 sfârsitul fisierului
Valoarea argumentului 'offset' poate fi pozitiva, negativa sau zero.
De exemplu, pentru a pozitiona pointerul cu 1000 de octeti înainte de sfârsitul 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 fisier
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 = "carte.txt";
$fh = @fopen($nume, "ab");
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
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 "carte.txt" 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 încât 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 sfârsitul 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 când se scrie în fisiere binare
sub Microsoft Windows.
Windows prefera secventa de terminare a liniei "\r\n". Atunci când 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().
1. basename(adresa, "sufix")
- Returneaza partea cu numele fisierului dintr-o adresa URL. "sufix" e optional, daca e
specificat, functia elimina si pe acesta de la sfarsitul numelui.
<?php
$url = 'http://www.marplo.net/php-mysql/index.php';
$file = basename($url); // $file e "index.php"
$file = basename($url, ".php"); // $file e "index"
?>
2. chmod(file, mod)
- Modifica prmisunile CHMOD a lui "file" (cale si nume fiser) cu cele specificate la "mod"
(0777, 0644, ...). Daca modificarea reuseste returneaza TRUE, in caz contrar, FALSE.
<?php
chmod("director/fisier.ext", 0755);
?>
3. copy(sursa, destinatie)
- Copie fisierul specifical la "sursa", in locatia "destinatie" (aici poate fi specificata si
denumirea fisierului la dstinatie). Aca fisierul deja exista, va fi inlocuit de cel copiat. Funtctia
returneaza TRUE in caz de reusita sau FALSE.
"> <?php
$file = 'examplu.txt';
$newfile = 'dir/examplu.txt.bak';
if (!copy($file, $newfile)) {
echo "Fisierul$file nu a putut fi copiat \r\n";
}
?>
4. dirname(adresa)
- Returneaza numele directorului din "adresa", fara numele fisierului sau alte extensii.
<?php
$url = 'marplo.net/php-mysql/index.php';
$dir = dirname($url);
5. disk_free_space(cale_dir)
- Returneaza spatiul liber al sistemului in directorul specificat la "cale_dir". Returneaza
numarul de bytes liberi sau FALSE daca functia esueaza.
<?php
$dir = '/'; // Directorul radacina
echo disk_free_space($dir); // 123456789
?>
6. disk_total_space(cale_dir)
- Returneaza spatiul total al sistemului in directorul specificat la "cale_dir". Returneaza
numarul total de bytes sau FALSE daca functia esueaza.
7. fopen("fisier", "mod")
- Deschide un pointer la "fisier", in modul de lucru "mod". "mod" poate fi ("b" e indicat sa fie
adaugat pentru sistemele windows):
• r sau rb - pentru citire.
• r+ sau r+b - citire si scriere.
• w sau wb - creare si scriere fisier de la 0.
• w+ sau w+b - citire si scriere fisier de la 0, il creaza daca nu exista.
• a sau ab - scriere, adauga datele dupa cele deja existente. Creaza fisierul daca nu
exista.
• a+ sau a+b - citire si scriere, adauga datele dupa cele deja existente. Creaza fisierul
daca nu exista
• x sau xb - creare si scriere, daca fisierul exista deja, returneaza eroare.
• x sau x+b - creare pentru citire si scriere, daca fisierul exista deja, returneaza eroare.
<?php
$file = 'tutoriale.php';
$fo = fopen($file, "a+b"); // Deschide fisierul, in modul de citire si adaugare date
fclose($fo); // Inchide pointer-ul, elibereaza memoria folosita
?>
8. fclose(file_pointer)
- Inchide deschiderea unui fisier cu "fopen()" (transmisa la "file_pointer"), eliberand memoria
folosita de acea deschidere. Returneaza TRUE daca functia reuseste, in caz contrar, FALSE.
<?php
$file = 'tutoriale.php';
$fo = fopen($file, "rb"); // Deschide fisierul, in modul de citire ("rb") si creaza pointer-ul
fisierului
fclose($fo); // Inchide pointer-ul, elibereaza memoria folosita
?>
9. feof(file_pointer)
- Testeaza sfarsitul unnui fisier cu deschiderea specificata la "file_pointer". Functie utila cand
fisierul e citit linie cu linie. Returneaza TRUE daca pointer-ul e la sfarsitul fisierului, altfel,
returneaza FALSE.
<?php
$file = 'tutoriale.php';
$fo = fopen($file, "rb"); // Deschide fisierul, in modul de citire ("rb")
// Parcurge fisierul pana ajunge la sfarsit (atunci "feof" e TRUE - adica "!feof" e FALSE)
while(!feof) {
}
12. file_get_contents("fisier")
- Returneaza tot continutul din "fisier" intr-un sir. Daca "fisier" nu poate fi citit, returneaza
FALSE.
15. fileatime("file")
- Returneaza timestamp-ul (timpul UNIX) cand a fost accesat ultima data "file", sau in caz de
nereusita, FALSE.
<?php
$file = 'somefile.txt';
if (file_exists($file)) {
echo "$file a fost accesat in data: " . date("F d Y H:i:s", fileatime($file));
}
// Afiseaza ceva de genul: somefile.txt a fost accesat in data: April 14 2010 22:16:23
?>
16. filectime("file")
- Returneaza timestamp-ul (timpul UNIX) cand a fost modificat ultima data "file", sau in caz
de nereusita, FALSE. Similara cu aceasta e functia filemtime()
17. fileperms("file")
- Returneaza permisiunile CHMOD ale "file", sau FALSE.
18. filesize("file")
- Returneaza marimea lui "file", in bytes, sau FALSE.
fclose($fo);
?>
21. ftell(file_pointer)
- Returneaza pozitia curenta a indicatorului (pointer) dintr-un fisier deschis cu "fopen()"
(specificat la "file_pointer"). In caz de esec returneaza FALSE.
<?php
// Deschide un fisier si citeste cateva caractere
$fo = fopen("dir/file.txt", "rb");
$data = fgets($fo, 12);
// Afiseaza locatia unde e acum pointer-ul in fisier
echo ftell($fo); // 11
fclose($fo);
?>
fclose($fo);
}
?>
23. is_dir("nume")
- Returneaza TRUE daca "nume" exista si este un director, altfel returneaza FALSE.
<?php
if (is_dir('php')) echo 'php este un director in cel curent';
?>
24. is_file("nume")
- Returneaza TRUE daca "nume" exista si este un fisier, altfel returneaza FALSE.
<?php
if (is_file('php/tutoriale.php')) echo 'tutoriale.php este un fisier in directorul "php" din cel
curent';
?>
25. is_readable("nume")
- Returneaza TRUE daca "nume" (fisier sau director) exista si poate fi citit, altfel returneaza
FALSE.
<?php
// Daca fisierul poate fi citit, il citeste si afiseaza continutul
if (is_readable('php/tutoriale.php')) readfile('php/tutoriale.php');
?>
26. is_uploaded_file("fisier_up")
- Returneaza TRUE daca "fisier_up" a fost incarcat pe server, prin upload si primit prin
$_POST, altfel returneaza FALSE. Parametrul functiei trebuie sa fie de forma
"$_FILES['userfile']['tmp_name']".
<?php
// Daca fisierul poate fi citit, il citeste si afiseaza continutul
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) echo 'Fisierul a fost incarcat';
else echo 'Fisierul nu a putut fi incarcat';
?>
27. is_writable("nume")
- Returneaza TRUE daca "nume" (fisier sau director) exista si poate sa scrie in el, altfel
returneaza FALSE.
<?php
if (is_writable('php/tutoriale.php')) echo 'tutoriale.php poate fi scris';
?>
29. pathinfo("adresa_file")
- Returneaza o matrice cu informatiile: ale "adresa_file".
<?php
$path_parts = pathinfo('/www/htdocs/index.php');
30. readfile("fisier")
- Citeste si returneaza la browser (afiseaza) continutul din "fisier". In caz de esec returneaza
FALSE.
31. realpath("cale_adresa")
- Returneaza calea reala in sistem a unei adrese din "cale_adresa", rezolvand referinte
ca .. / ./ ../.
<?php
echo realpath('./../../etc/passwd'); // /etc/passwd
echo realpath('/windows/system32'); // C:\WINDOWS\System32
echo realpath(__FILE__); // Va returna calea absoluta pe server a fisierului curent
?>
33. rewind(file_pointer)
- Readuce pozitia pointer-ului dintr-un fisier deschis cu "fopen()" (specificat la "file_pointer")
la inceputul fisierului (0, primul caracter). In caz de succes returneaza TRUE, altfel FALSE.
<?php
// Deschide un fisier si citeste cateva caractere
$fo = fopen("tutorial.txt", "rb");
$data = fgets($fo, 12);
fclose($fo);
?>
34. rmdir("dir")
- Sterge directorul specificat la "dir". Acesta trebuie sa fie gol. In caz de succes returneaza
TRUE, altfel FALSE.
36. tmpfile()
- Creaza un fisier temporar, cu nume unic. Returneaza un pointer de fisier, ca si "fopen()", cu
modul de deschidere "w+". In caz de nereusita returneaza FALSE. Cu "fclose()" fisierul
temporar va fi sters.
<?php
$temp = tmpfile(); // Creaza fisierul temporar
fwrite($temp, "Text scris in fisierul temporar creat"); // Scrie ceva in el
rewind($temp); // Readuce pointerul la inceputul fisierului
echo fread($temp, 1024); // Citeste si afiseaza primii 1024 bytes
fclose($temp); // Inchide si sterge fisierul temporar creat
?>
37. unlink("fisier")
- Sterge fisierul specificat. In caz de succes returneaza TRUE, altfel FALSE.
<?php
if (unlink("test.txt")) echo 'Fisierul a fost sters.';
else echo "Stergerea fisierului nu a reusit.";
?>
- 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 încât 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.
session_start();
if(!isset($_SESSION['userName']))
$_SESSION['userName'] = "MarPlo";
?>
//Fisierul b.php
session_start();
?>
<?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, "a.php", va fi afisat urmatorul rezultat
Aceasta este pagina "a.php"
Variabila de sesiune are valoarea: MarPlo
Legatura spre pagina b.php
Cand apasam click pe link-ul "spre pagina b.php", se va deschide aceasta pagina, afisand
urmatorul continut:
Aceasta este pagina "b.php"
Variabila de sesiune are valoarea: MarPlo
- In acest exemplu se observa ca pagina "b.php" detine informatii despre variabila de sesiune
creata in pagina "a.php".
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();
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";
?>
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 decât 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
- Un sir de caractere de lungime fixa, cu un maxim de m caractere, unde
CHAR(m) m este mai mic decât 256. Pentru obtinerea lungimii dorite, se insereaza
spatii finale
DATE - O data în format an-luna-zi; de exemplu 2008-10-15
- Un numar zecimal, reprezentat sub forma de sir cu "m" cifre, din care
DECIMAL
"d" se afla la dreapta punctului zecimal. Daca "m" si "d" sunt omise, în
DECIMAL(m,d)
mod prestabilit se vor utiliza valorile 10 si 0
DOUBLE - Un numar cu virgula mobila, cu dubla precizie, având o latime de
DOUBLE (m, d) afisare egala cu "m" si un numar de "d" cifre dupa virgula.
- Un numar cu virgula mobila, cu simpla precizie, având o latime de
FLOAT(m,d)
afisare egala cu "m" si un numar de "d" cifre dupa virgula
- Un întreg pe 32 de biti. Daca se specifica atributul UNSIGNED,
INTEGER
domeniul de valori este cuprins între 0 si 4294967295; în caz contrar,
INTEGER UNSIGNED
domeniul este cuprins între valorile -2147483648 si 2147483647
NUMERIC
- Similar cu DECIMAL
NUMERIC (m, d)
REAL
- Similar cu DOUBLE
REAL(m, d)
- Un întreg pe 16 biti. Daca se specifica atributul UNSIGNED, domeniul
SMALLINT
de valori este cuprins între 0 si 65535; în caz contrar, domeniul este
SMALLINT UNSIGNED
cuprins între valorile –32768 si 32767
TIME - Ora în format ora-minut-secunda; de exemplu, 08-20-00. O valoare de
TIMESTAMP tip data si ora, în format an-luna-zi ora-minut-secunda; de exemplu,
TIMESTAMP(m) 1976-01-05 00:00:00. 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.
- Un sir caracter de lungime variabila, cu un maximum de "m" caractere,
unde m este mai mic decât 256 pentru versiuni MySQL anterioare 5.0.3,
VARCHAR(m)
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.
•
○ - Pentru cantitati foarte mari sau foarte mici, alegeti DOUBLE ca tip de date.
○ - Pentru coloane care contin numere fara parte zecimala de dimensiuni medii,
alegeti SMALLINT sau INTEGER ca tip de date.
○ - 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 utilizând 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 rând 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 modificarea 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;
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.
Când 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 tinând
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
Adevarat daca valoarea lui x este un membru al listei y1, y2. Lista
x IN (y1, y2)
poate contine unul, doi sau mai multi membri
Adevarat daca valoarea lui x nu este un membru al listei y1, y2.
x NOT IN (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 sub-sirul '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 rândurile care au pretul de carte mai mare
decât 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. Modificarea datelor dintr-o baza de date
Sub-limbajul SQL, Data Manipulation Language, include comenzi care va permit sa inserati
rânduri noi într-un tabel, sa actualizati una sau mai multe coloane ale rândurilor existente,
respectiv sa stergeri rânduri dintr-un tabel.
Pentru a insera un nou rând î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 rândul.
- "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 când 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 când 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 rând sau mai multor rânduri 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 rânduri 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 rândul sau rândurile 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 rând dintr-un tabel, folositi comanda "DELETE", care are urmatoarea
forma:
• DELETE FROM tabel WHERE conditie;
Daca se vrea a fi sterse toate rândurile tabelului, clauza WHERE poate fi omisa.
De exemplu, comanda urmatoare sterge rândul 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 câmpuri 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
rândurilor tabelului. Iata cele mai importante functii in acest sens:
Functie Descriere
count(*) - Numarul rândurilor din tabel
- Numarul rândurilor din tabel care contin o valoare
count(coloana)
diferita de NULL în coloana specificata
- Numarul valorilor distincte diferite de NULL care
count(distinct coloana)
apar în coloana specificata
- Valoarea mijlocie (medie) a coloanei numerice
avg(coloana)
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 decât
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
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 s-a 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");
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 Tip
id Identificator unic, Not Null, cheie primara
nume Char(30)
autor Char(25)
gen Char(10)
data_intrare Date
pret 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-05-2009', '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
Observati sintaxa de scriere corecta a interogarilor MySQL in PHP, numele tabelului se scrie
intre caracterele ( ` ` ) si valorile intre ghilimele simple ( ' ' )
Pe langa formula "WERE" pot fi folosite si comenzile AND (si) sau OR (sau), pentru a
efectua selecturi mai complexe, sau mai precise, cautand randurile in functie de valorile mai
multor coloane.
- De exemplu, daca se doreste selectarea doar a randurilor in care avem "col1" cu valoarea
"val1" si "col2" cu valoarea "val2"; randul selectat sa indeplineasca ambele conditii, se
foloseste comanda SQL cu AND astfel:
$sql = "SELECT `col1`, `col2` FROM `tabel` WHERE `col1`='$val1' AND `col2`='$val2'";
- Daca se doreste selectarea randurilor in care avem "col1" cu valoarea "val1" sau "col2" cu
valoarea "val2"; randul selectat sa indeplineasca una (oricare) din aceste conditii, se foloseste
comanda SQL cu OR astfel:
$sql = "SELECT `col1`, `col2` FROM `tabel` WHERE `col1`='$val1' OR `col2`='$val2'";
2. Cautare dupa un anumit termen in rand
O alta selectare necesara este atunci cand se doreste cautarea randurilor care au in datele din
coloana un anumit termen sau cuvant. Pentru aceasta se folosesc impreuna comenzile
WHERE si LIKE.
Se adauga la comanda SQL formula: WHERE `coloana` LIKE 'termen'
De exemplu:
$sql = "SELECT `col1`, `col2` FROM `tabel` WHERE `col1` LIKE '$term'";
- Valoarea lui '$term' poate fi un cuvant sau fraza exacta, ori o parte dintr-un cuvant, in acest
caz se foloseste si caracterul "%", astfel, pot fi obtinute urmatoarele 4 cazuri:
• 'term' - va returna randurile in care valoarea coloanei este exact cuvantul "term", fara
altceva.
• 'term%' - va gasi randurile in care valoarea coloanei incepe cu "term", cum ar fi:
"term ceva", "termenii", etc.
• '%term' - va gasi randurile in care valoarea coloanei se termina cu "term", cum ar fi:
"12term" "ceva term", etc.
• '%term%' - va returna randurile in care coloana are in valoarea ei (oriunde, si in
interiorul continutului) termenul "term", cum ar fi: "term ceva" "ceva 12termeni",
"ceva ex-terma altceva", etc.
De obicei, termenul cautat este preluat dintr-un formular. Trebuie sa tineti cont de modul in
care au fost adaugate datele in tabelul MySQL, daca au fost filtrate cu o functie, precum
"mysql_real_escape_string()", cand se face selectul pentru cautare trebuie aplicata aceeasi
functie termenului cautat.
- Mai jos puteti studia si folosi codul unui model de script, cu formular, pentru selectarea
dintr-un tabel MySQL a randurilor in care se gaseste termenul transmis prin formular.
Explicatiile detaliate sunt in codul scriptului.
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ro">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Script cautare MySQL</title>
<meta name="description" content="Script cu formular pt cautare in tabel
MySQL. Tutorial de la http://www.marplo.net" />
<meta name="keywords" content="script cautare" />
</head>
<body>
<?php
// Script - Tutorial de la http://www.marplo.net