Documente Academic
Documente Profesional
Documente Cultură
Un script PHP poate fi foarte simplu sau foarte complex. Totusi, scrierea chiar si a unui script
PHP complex este relativ simpla, necesitand doar un editor de texte obisnuit. In aceasta lectie
veti invata modul de creare si de executare a programelor PHP, veti invata sa creati scripturi PHP
simple, care afiseaza in navigatorul web un text simplu. De asemenea, veti invata sa va
documentati scripturile, astfel incat dumneavoastra si alte persoane sa puteti intelege rapid
scopul si structura acestora.
Mai intai trebuie sa instalati un server web (Apache) si modulul pt. limbajul PHP, acestea sunt
gratuite, le puteti gasi pe net si instala pe fiecare, dar pentru incepatori e recomandat un program
care le are deja configurate (si cu MySQL), precum WampServer, sau sa incarcati scriptul pe un
server web unde este instalat PHP.
Daca nu aveti deja instalat PHP, descarcati de aici -> WampServer, dezarhivati si instalati
programul. (cand este pornit, veti observa o iconita specifica in colltul cu ceasul).
Fisierele .php in care veti scrie scripturile trebuie sa le salvati in directorul www din "wamp",
apoi, ca sa le testati scrieti in browser adresa http://localhost/fisier.php
<?php
?>
- Acesta este un cod de inceput si nu afiseaza nimic.
Apoi, salvati scriptul dumneavoastra sub forma de fisier text, in directorul "www" din "wamp",
cu un nume care respecta urmatoarele reguli:
Este recomandat ca numele fisierului sa fie alcatuit numai din caractere minuscule, cifre
si liniute. Utilizarea de spatii, majuscule si alte caractere ar putea crea probleme pe
sisteme de operare diferite.
Executa prelucrari ale datelor, respectiv obtine accesul la datele stocate in fisiere si baze
de date si le manipuleaza.
Primele doua operatii sunt oarecum mai dificil de realizat decat cea de-a treia. Totusi, afisarea
datelor astfel incat acestea sa fie vizibile utilizatorului este o operatie foarte simpla. Asa cum
paragrafele unui text scris sunt compuse din propozitii, programele PHP sunt alcatuite din
instructiuni. Regulile care controleaza formarea propozitiilor se numesc sintaxa. Acelasi termen
este folosit si pentru a desemna regulile care guverneaza formarea instructiunilor PHP.
Iata un exemplu pentru crearea instructiunii PHP care trimite date de iesire la un browser Web,
astfel incat acestea sa fie vizibile pentru un utilizator:
<?php
echo "scrieti aici un text oarecare";
?>
nvatati sa folositi ghilimele si caractere escape pentru a specifica valori de tip sir
speciale
operatorul uman. Datele trebuie stocate sub forma de siruri daca formatul acestora nu este
numeric sau daca doriti ca operatorul uman sa fie capabil de a introduce sau de a vizualiza datele.
Practic, puteti asimila numerele cu un mod de stocare a datelor n interiorul calculatorului.
Sirurile se pot asimila unui mod de stocare a datelor n afara calculatorului.
Aceste doua mari categorii de date: numere si siruri, formeaza opt tipuri principale de variabile :
- Boolean
- Integer
- Float
- String
- Array
- Object
- Resource
- Null
In mod normal tipul variabilelor nu este specificat explicit; acesta va fi evaluat de catre
interpretorul PHP la momentul run-time (in momentul executarii scriptului).
1. Tipul boolean
Variabilelele de tipul boolean pot lua doar doua valori : FALSE sau TRUE
Variabilele de alt tip decat boolean pot fi convertite la tipul boolean prin operatorul cast (bool)
sau (boolean), plasate inaintea valorilor, desi in general nu e nevoie de aceasta converrire,
valoarea fiind automat recunoscuta de PHP.
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 stnga
numarului. Evitati sa scrieti spatii sau virgule ca parte a unui ntreg PHP.
Iata cteva exemple de numere PHP ntregi :
215678 - Numar in reprezentare zecimala
0x1A8; - Numar in reprezentare hexazecimala (reprezinta: 1*16*16 + 10*16 + 8 =
424 (in zecimal))
067
- Reprezinta: 6*8 + 7 = 55 (in zecimal)
Valorile minime, respectiv maxime pe care le poate lua o variabila de tip integer depind de
sistemul de operare pe care ruleaza modulul PHP. De exemplu pentru un sistem Windows
valoarea unui integer se memoreaza pe 32 de biti: 31 bit pentru numar si un bit pentru semn. In
acest caz valorile unui intreg se afla in intervalul :-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 pna la 1,8 x 10 la
puterea 308 sub forma de numere duble si furnizeaza aproximativ 14 cifre dupa punctul zecimal
(sau cifre semnificative) de precizie.
Iata cteva exemple de numere duble (tipul float)
123.4567
1.2e3;
4. Tipul string
Reprezinta o insiruire de caractere, fiecare caracter este memorat pe 1 byte; setul de caractere
este limitat la 256 valori distincte. Dimensiunea sirurilor poate fi oricat de mare in PHP, nu exista
specificatii care sa limiteze numarul maxim de caractere dintr-un sir.
Spre deosebire de ntregi si de numere float, care contin cifre, sirurile pot contine orice caracter.
Ca atare, sirurile sunt utile pentru stocarea datelor care nu pot fi calculate, precum nume, fraze si
adrese.
In PHP, un sir poate fi declarat in mai multe feluri:
1) Un mod simplu de a declara un sir este prin delimitarea cu ghilimele simple (' ')
Daca dorim ca sirul sa contina caracterul ' va trebui sa inseram inaintea lui caracterul escape \.
Daca dorim ca sirul sa contina caracterul \ va trebui sa dublam acest caracter. Acest
comportament este exemplificat in exemplul urmator:
<?php
$var1 = 'Acesta este un sir de test';
echo 'Curs \'PHP\'';
echo '<br />Vrei sa stergi C:\\*.* ?';
echo '<br />Variabila var1=$var1';
echo "<br />Variabila var1=$var1";
?>
In browser va aparea:
Curs 'PHP'
Vrei sa stergi C:\*.* ?
Variabila var1=$var1
Variabila var1=Acesta este un sir de test
Observati diferenta dintre ultimile doua linii!
In penultima linie, unde s-a folosit gilimele simple pentru delimitarea sirului, variabila $var1 nu
este expandata adica nu este afisat valoarea variabilei var1=Acesta este un sir de test ci exact
textul scris (numele ei). Pentru a realiza afisarea valorii variabilei si nu numele acesteia, se
folosesc ghilimelele duble, precum in ultima linie a exemplului de mai sus.
2) O alta metoda pentru a specifica un sir n PHP este prin folosirea ghiimelelor duble (" ").
Daca intr-un sir delimitat prin ghilimele duble vrem ca acesta sa afiseze numele unei variabile,
nu valoarea acesteia, adaugam un caracter backslash (\) inaintea numelui variabiei.
Exemplu; echo "Numele variabilei este \$var";
Acest cod va afisa Numele variabilei este $var, oricare ar fi valoarea variabilei "$var".
Caracterele care alcatuiesc sirul sunt incluse ntre ghilimele duble (" ");
De exemplu, sirul reprezentnd numele fizicianului care a formulat teoria relativitatii este
"Albert Einstein". Asa cum s-a explicat, un sir poate contine date numerice; de exemplu,
"3.14159".
Daca se doreste adaugarea de ghilimele duble intr-un sir delimitat de ghilimele duble, se adauga
caracterul \ in fata acestora.
Exemplu; echo "Numele programului este \"PHP\".";
Prin delimitarea cu ghilimele duble PHP faciliteaza includerea n siruri a unor caractere speciale,
precum caracterele de salt la linie noua sau retur de car, prin furnizarea de secvente escape care
reprezinta caractere speciale.
Iata secventele escape folosite n PHP:
\\ - 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 ntrun sir, trebuie sa folositi doua caractere backslash.
Pe langa imbricarea variabilelor in cadrul sirurilor delimitate prin ghilimele duble, PHP pune la
dispozitie operatorul de concatenare a sirurilor: . (punct) . Acest operator adauga un sir la
sfarsitul altui sir. De exemplu:
<?php
$nume = 'Popescu';
$prenume='Costel';
echo 'Numele de familie este '.$nume. 'iar prenumele este '.$prenume;
?>
In browser va aparea:
Numele de familie este Popescu iar prenumele este Costel
In anumite situatii este necesar sa accesam unul dintre caracterele unui sir. Pentru aceasta putem
folosi parantezele{} ca in exemplul de mai jos:
<?php
$var1 = 'Acesta este un sir de test';
echo $var1{0}; // Afisaza A (primul caracter din sir)
echo $var1{2}; // Afisaza e (al treilea caracter din sir)
?>
Rezultatul afisat va fi
Ae
3) Sintaxa heredoc este o alta modalitate de a delimita siruri
In acest caz delimitatorul este ("<<<"); acesta trebuie urmat de un identificator unic, dupa care
urmeaza sirul de caractere, iar secventa se incheie din nou cu identificatorul mentionat.
Identificatorul de incheiere trebuie sa se afle in prima coloana a liniei, acesta poate contine
caractere alfanumerice dar neaparat trebuie sa inceapa cu o litera, nu cu o cifra sau alt semn.
Veti intelege mai bine studiind exemplu de mai jos:
<?php
$var1 = <<< EOT
Exemplu de sir care foloseste delimitatorul heredoc.
EOT;
echo $var1;
?>
Rezultatul afisat va fi:
Exemplu de sir care foloseste delimitatorul heredoc.
5. Tipul array
Reprezinta un vector de valori (care creaza o matrice, vezi Lectia 9 despre matrice), fiecare
element al matricei are asociat o cheie. Aceasta cheie va fi folosita ulterior la identificarea unui
element specific at matricei. In PHP tipul array se mai numeste si tip map ordonat, deoarece
elemente vectorului sunt ordonate dupa campul cheie.
Variabilele de tip array si lucrul cu acestea vor fi prezentate mai detaliat in lectiile urmatoare.
Iata un exemplu simplu de variabile array:
<?php
$fructe[0] = 'mere';
$fructe[1] = 'caise';
$fructe[2] = 'piersici';
?>
6. Tipul object
Reprezinta de fapt instanta unei clase declarate in PHP. O clasa este o structura care contine
variabile membru si functii membru.
Variabilele de tip object si lucrul cu acestea vor fi prezentate detaliat in lectiile urmatoare.
7. Tipul resource
Este un tip special de variabila care pastreaza o legatura spre resurse externe. Exemple de resurse
externe: manipulatori pentru deschidere de fisiere, conectare la baze de date, compresia
fisierelor, resurse COM, etc...
8. Tipul NULL
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
$var
$Numar
$_elemente
Pentru a asocia o valoare unei variabile, veti scrie ceea ce se numeste o instructiune de atribuire.
Iata un exemplu simplu:
$temperatura = 33.5;
Numele variabilei este urmat de un semn egal (=), care identifica instructiunea ca fiind o
instructiune de atribuire. Semnul egal este urmat de valoarea care urmeaza a fi atribuita
variabilei, n acest exemplu, valoarea este data de valoarea literala dubla (float) 33.5. Caracterul
$_POST variabile furnizate scriptului prin metoda HTTP POST (in general prin
formulare)
2. Operatori
Pentru a va ajuta sa efectuati calcule si prelucrari ale datelor, PHP include o diversitate de
operatori si functii utile. Cnd combinati valorile literale si variabilele cu operatori si functii,
construiti ceea ce este cunoscut sub numele de expresii.
Operatorii sunt simboluri specifice care realizeaza o actiune specifica in cadrul unei expresii.
Operatorii actioneaza asupra variabilelor prezente in expresie. De exemplu in cadrul expresiilor
matematice vom folosi operatori aritmetici.
$a + $b
Adunare : a+b
$a - $b
Scadere : a-b
$a * $b
Inmultire: a*b
$a / $b
Impartire: a/b
$a%$a
$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
3. Functii
n afara de operatori, PHP include functii care executa operatii utile. Iata unele exemple de
functii:
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
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:
Fiecare element, camp dintr-un formular trebuie sa aibe un nume distinct, dat prin atributul
"name"; acest nume este folosit de scriptul PHP la care sunt trimise datele, astfel, scriptul PHP
recunoaste datele din campul respectiv folosind numele acestuia.
http://www.marplo.net/script.php?nume=Popescu
http://www.marplo.net/script.php
Metoda GET permite transmiterea unui volum limitat de informatii catre server; de asemenea nu
este recomandata folosirea acestei metode in cazul in care dorim sa transmitem date personale(de
exemplu parolele introduse intr-un formular pot fi vizualizate de oricine in browserul de Web).
- unde "nume este valoarea atributului name al elementului din formularul HTML.
Sa luam un exemplu practic de formular HTML care trimite date (prin method="post") la un
script PHP unde acestea vor putea fi vizualizate.
Salvam scriptul de mai jos intr-un fisier pe care-l numim "test-form.php"
<?php
$nume = $_POST['nume'];
$email = $_POST['email'];
$parola = $_POST['parola'];
echo "Nume = $nume";
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']
http://www.marplo.net/fisier.php?nume1=valoare1&nume2=valoare2
Exemplul include numai doua perechi "nume-valoare"; cu toate acestea, puteti include oricte
asemenea perechi doriti (separate prin caracterul &), in functie de limita impusa de browser.
Pentru a prelua si folosi datele dintr-o astfel de adresa URL, folositi in interiorul scriptului PHP
expresia "$_GET['nume'], ca in exemplu urmator"
$var1 = $_GET['nume1']
$var2 = $_GET['nume2']
Unde "nume1" si "nume2" sunt numele variabilelor din adresa URL, iar "$var1" si "$var2" sunt
variabilele care vor fi folosite in scriptul PHP (din "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
Variabila de mediu
Descriere
CONTENT_LENGTH
CONTENT_TYPE
DOCUMENT_ROOT
GATEWAZ_INTERFACE
HTTP_ACCEPT
HTTP_ACCEPT_CHARSET
HTTP_CONNECTION
HTTP_HOST
HTTP_REFERER
HTTP_USER_AGENT
PATH
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REQUEST_METHOD
REQUEST_URI
SCRIPT_FILENAME
SCRIPT_NAME
SERVER_ADMIN
SERVER_HOST
SERVER_PORT
SERVER_PROTOCOL
SERVER_SIGNATURE
SERVER_SOFTWARE
O caseta de dialog, prin care sunteti ntrebat daca doriti sa descarcati fisierul care contine
scriptul
La vizualizarea rezultatelor unui script PHP se pot produce numeroase erori, chiar daca scriptul
n sine este corect.
- Daca vedeti textul scriptului dumneavoastra sau o caseta de dialog prin care sunteti ntrebat
daca doriti sa descarcati fisierul care contine scriptul, este posibil ca extensia fisierului script sa
fie incorecta sau ca serverul PHP sa nu functioneze. Desi fisierele script PHP trebuie sa aiba, n
general, extensia .php, este posibil (dar mai rar) ca un administrator de sistem sa configureze un
server PHP astfel nct acesta sa impuna o alta extensie de fisier. Astfel, daca scriptul
dumneavoastra esueaza din unul dintre aceste doua motive, luati legatura cu administratorul
dumneavoastra de sistem.
- Daca vedeti un mesaj n care se spune ca scriptul nu exista, este posibil ca dumneavoastra sa fi
tastat incorect adresa URL. Verificati daca ati tastat corect adresa URL identificata de
administratorul dumneavoastra de sistem, precum si daca ati atasat corect la aceasta numele
fisierului care contine scriptul, folosind un slash numai daca adresa URL identificata de
administratorul dumneavoastra de sistem nu se ncheie cu acest caracter.
- Daca vedeti un mesaj n care se arata ca browserul dumneavoastra Web nu are permisiunea de a
obtine accesul la script, poate ca este necesar sa modificati permisiunile fisierului script. Pentru a
afla cum trebuie procedat, consultati-va cu administratorul de sistem.
- Daca vedeti un mesaj n care se spune ca scriptul dumneavoastra contine o eroare, verificati
daca nu a aparut vreuna din urmatoarele probleme:
O eroare de punctuatie, cum ar fi paranteze, ghilimele sau punct si virgula, lipsa sau
inserate gresit
De exemplu, iata un script care contine un tip de eroare frecvent ntlnit. Puteti identifica
eroarea?
<?php
// Acest script contine o eroare de sintaxa
echo "Salut, World Wide Web!;
?>
Din script lipseste caracterul ghilimele duble de nchidere, care trebuie sa delimiteze expresia de
tip text. Daca ncercati sa executati acest script, puteti vedea doar o pagina goala sau o eroare
similara celei prezentate n continuare.
Parse error. Parse error in /home/bmccarty/public_html/php/module-01/syntax-error.php On line
7
Mesajul de eroare ncearca sa va indice sursa erorii, indicnd numarul liniei la care s-a produs
eroarea. Totusi, remarcati ca mesajul va ndruma spre linia 7 a unui script care contine numai 4
linii. Din moment ce ghilimelele duble de nchidere lipsesc, serverul PHP cauta dincolo de
sfrsitul scriptului pentru a gasi ghilimelele duble respective. Ca atare, serverul PHP este
oarecum derutat cu privire la sursa erorii.
Morala este aceea ca nu puteti conta n totalitate pe serverul PHP pentru a determina locatia
erorii; folositi numarul de linie furnizat de server numai ca ndrumar pentru a depista locatia
probabila a erorii.
3. Tratarea erorilor
Modulul PHP poate fi configurat astfel incat sa afiseze erorile intilnite in codul PHP. Acest lucru
poate fi foarte util in cazul depanarii programelor. Pentru a activa afisarea erorilor exista doua
metode:
In cazul primei metode trebuie sa avem drepturi de administrator pentru a modifica fisierul
php.ini. Nu se recomanda setarea parametrului display_errors la valoarea 1(TRUE) in cazul site-
urilor de productie; mesajele de eroare afisate nu sint folositoare utilizatorului. Pe de alta parte
aceasta ar contribui la marirea riscului unui atac.
A doua metoda consta in folositrea functiei ini_set, care permite unui script sa redefineasca
temporar un parametru din fisierul de configurare php.ini.
Consideram un exemplu de cod in care intentionat incercam sa citim variabile care nu exista:
<?php
ini_set('display_errors',1);
echo "Valoarea transmisa este ".$var;
?>
In exemplul de mai sus daca variabila cu nume: "var" nu exista PHP va afisa un mesaj de eroare
de genul:
Notice: Undefined variable: var
Putem determina tipurile de erori pe care le semnaleaza PHP folosind functia:
error_reporting(). Aceasta preia o constanta care specifica nivelul la care se afiseaza erorile.
Exemplu :
<?php
ini_set('display_errors',1);
error_reporting(E_ALL & ~E_NOTICE);
echo "Valoarea transmisa este ".$_GET['orase'];
?>
- Testati acest exemplu pentru a vedea rezultatul.
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:
echo defined("PI");
Valoarea "pi" este folosita extrem de frecvent n unele calcule. Pentru comoditate, PHP
furnizeaza o functionalitate mai indicata dect definirea unei constante cu valoarea pi, functia
pi() returneaza valoarea respectiva, cu 14 cifre semnificative (3.1415926535898).
Astfe, puteti calcula aria unui cerc folosind urmatoarea expresie:
$x = 1;
$y = 2.5;
$z = $x+$y;
echo $z;
$x = 1;
echo $y
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.
$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.
intval()
strval()
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");
"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
// 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)) {
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 )
$var = 'Un sir oarecare';
print_r($var);
// Un sir oarecare
?>
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');
// Transforma si adauga elementele /valorile variabilei $aray intr-un sir specific
$sir_var = serialize($aray);
echo $sir_var;
// a:2:{s:4:"site";s:14:"www.marplo.net";s:3:"php";s:9:"tutoriale";}
echo gettype($var);
// double
// 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" }
$sir = 'Sir test';
var_dump($sir);
?>
// 'Sir test'
$a<1;
Aceasta expresie conditionala foloseste operatorul <, care are, n esenta, aceeasi semnificatie ca
n algebra. Expresia are valoarea TRUE daca si numai daca valoarea variabilei $a este mai mica
dect 1; n toate celelalte cazuri, are valoarea FALSE.
Puteti forma expresii conditionale complexe prin unirea a doua expresii conditionale cu ajutorul
unui operator logic. De exemplu, expresia urmatoare este adevarata daca ambele expresii
conditionale care o compun sunt adevarate:
Cu alte cuvinte, expresia este adevarata daca att variabila $a, ct si variabila $b au valori mai
mici dect 1.
PHP furnizeaza un set de asemenea operatori relationali, prezentati pe scurt n tabelul de mai jos.
Puteti folosi operatorii logici pentru compararea sirurilor; cu toate acestea, un sir care apare ntro expresie conditionala este convertit la o valoare numerica nainte de evaluarea expresiei.
Deseori, se ajunge la rezultate neasteptate, n general, valorile sirurilor trebuie sa fie comparate
folosind o functie de comparare a sirurilor; aceste functii vor fi explicate n lectiile urmatoare.
Operatori logici
Operator
Descriere
$a < $b - TRUE daca valoarea lui $a este mai mica dect valoarea lui $b.
$a > $b - TRUE daca valoarea lui $a este mai mare dect valoarea lui $b.
$a >= $b - TRUE daca valoarea lui $a este mai mare sau egala cu valoarea lui $b
$a <= $b - TRUE daca valoarea lui $a este mai mica sau egala cu valoarea lui $b
$a = $b - TRUE daca valoarea lui $a este egala cu valoarea lui $b.
- TRUE daca $a si $b sunt identice; cu alte cuvinte, daca $a si $b au
$a == $b
acelasi tip si aceeasi valoare
$a != $b - TRUE daca valoarea lui $a este diferita de valoarea lui $b
- TRUE daca $a si $b nu sunt identice; cu alte cuvinte, daca $a si $b nu
$a !== $b
sunt de acelasi tip si aceeasi valoare
$x AND $y - TRUE daca att $x, ct si $y sunt adevarate
$x && $y - TRUE daca att $x, ct si $y sunt adevarate.
$x OR $y - TRUE daca minimum una din expresiile $x sau $y este adevarata.
$x || $y - TRUE daca minimum una din expresiile $x sau $y este adevarata.
$x XOR $y - TRUE daca numai una din expresiile $x sau $y este adevarata.
!$x
- TRUE daca $x este FALSE
NOT $x - TRUE daca $x este FALSE
Retineti ca puteti prefixa o expresie conditionala cu operatorul !, care inverseaza valoarea
"TRUE" sau "FALSE" a operandului sau.
Observati ca PHP foloseste doi operatori logici care executa aceeasi operatie (AND si &&)
respectiv (OR si ||).
Cu toate acestea, operatorii difera din punctul de vedere al precedentei - caracteristica care
determina ordinea n care sunt executate operatiile n timpul evaluarii expresiilor. Operatorii &&
si || au o precedenta relativ ridicata, n timp ce operatorii AND si OR au o precedenta relativ
redusa. Este la fel ca in aritmetica unde, intr-o ecuatie ca aceasta: a + b * c se executa intai
inmultirea si apoi adunarea, chiar daca ordinea lor este alta (daca nu sunt folosite paranteze). La
fel si in PHP, se pot folosi paranteze rotunde pentru a controla ordinea executarii operatiilor.
Pentru comoditate, puteti forma expresii conditionale fara un operator logic. De exemplu, daca
$a este o variabila numerica, puteti folosi expresia $a ca expresie conditionala. Expresia este
considerata ca avnd valoarea FALSE daca valoarea variabilei $a este zero, respectiv valoarea
TRUE daca valoarea variabilei respective este diferita de zero.
Daca folositi un sir ca expresie conditionala, expresia are valoarea FALSE daca sirul este vid sau
daca are valoarea speciala "\0", care simbolizeaza un octet cu valoarea zero.
Similar, utilizarea unei valori nedefinite ca expresie conditionala determina obtinerea valorii
FALSE. Daca folositi un tablou sau un obiect ca expresie conditionala, aceasta are valoarea
FALSE daca tabloul sau obiectul sunt vide (fara vreo valoare); n caz contrar, expresia are
valoarea TRUE.
If(conditie) {
Instructiune(1);
Instructiune(2);
..................
}
- Dupa cum se observa dupa if urmeaza o pereche de paranteze rotunde in interiorul carora se
plaseaza conditia, adica o expresie logica a carei rezultat poate fi TRUE sau FALSE. Daca si
numai daca rezultatul expresiei logice (conditia) este TRUE se vor executa instuctiunile :
Instructiune(1), apoi Instructiune(2), etc...
Se observa ca acest set de instructiune se plaseaza intre acolade. Doar intr-un singur caz aceste
acolade nu sunt necesare si anume: in cazul in care este scrisa doar o singura instructiune.
Daca rezultatul expresiei logice dintre paranteze rotunde este FALSE , setul de instructiuni dintre
acolade nu se va executa, controlul programului va trece mai departe.
Iata inca un exemplu, practic:
<?php
$numar = 12;
if ($numar > 10)
echo "Acesta este un numar mai mare decat 10";
?>
- Atunci cnd este executat scriptul, instructiunea if evalueaza expresia conditionala $numar >
10, care este adevarata (TRUE) numai daca valoarea variabilei $numar este mai mare dect 10.
Daca valoarea variabilei $numar este mai mare decat 10, se va executa instructiunea echo, in
caz contrar programul va trece mai departe.
In general, limbajul PHP ignora spatiile albe. In mod conventional, o instructiune asociata unei
instructiuni "if" este scrisa decalat n raport cu aceasta. Acest procedeu este recomandat deoarece
prin utilizarea sa este facilitata citirea programului.
Sa presupunem ca doriti sa executati o instructiune atunci cnd o conditie este TRUE si o alta
instructiune cnd conditia este FALSE. Instructiunea else va permite sa procedati astfel, dupa
cum urmeaza:
If(conditie) {
Instructiune(1);
Instructiune(2);
..................
}
else {
Instructiune(3);
Instructiune(4);
..................
}
In acest din urma caz daca expresia logica din paranteze: conditie este adevarata se vor executa
instructiunile: Instructiune(1); Instructiune(2); , iar daca valoarea expresiei logice : conditie are
valoarea FALSE se vor executa instructiunile: Instructiune(3); Instructiune(4);
Instructiunea asociata unei instructiuni if sau else poate fi ea nsasi o instructiune if. O asemenea
instructiune if se numeste "instructiune if imbricata".
Iata un exemplu de instructiune if imbricata:
<?php
$numar = 88;
if ($numar > 10)
if ($numar > 100)
echo "Acesta este un numar mai mare decat 100";
else
echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10";
else
echo "Acesta este un numar mic";
?>
Exemplul afiseaza mesajul "Acesta este un numar mai mare decat 100" daca valoarea variabilei
$numar depaseste 100; n caz contrar, daca valoarea variabilei $numar este mai mare dect 10
si mai mica decat 100, se afiseaza mesajul "Acesta este un numar mai mic decat 100, dar mai
mare decat 10". Daca valoarea variabilei $numar este mai mica sau egala cu 10, exemplul
afiseaza mesajul "Acesta este un numar mic".
Instructiunile if imbricate pot deveni extrem de dificil de nteles daca numarul de instructiuni si
nivelul de imbricare nu sunt relativ reduse. Deci trebuie sa le folositi cu economie.
O instructiune corelata att cu instructiunea if, ct si cu instructiunea else, este instructiunea
elseif. Cnd este folosita corect, poate fi mai simplu de nteles dect o instructiune if imbricata,
logic echivalenta cu aceasta.
Iata un exemplu de instrutiune elseif:
<?php
$numar = 88;
if ($numar > 100 )
default:
echo "Acesta nu este un cod valabil";
}
?>
- Actiunea unei instructiuni switch este determinata de valoarea unei expresii ntregi, nu de
valoarea unei expresii conditionale. Numele variabilei este dat ntre parantezele care urmeaza
dupa cuvntul cheie switch. Acoladele delimiteaza o serie de instructiuni case si o instructiune
default optionala, fiecare dintre instructiunile cuprinse ntre acolade putnd avea instructiuni
asociate.
Cnd este executata, instructiunea switch ncearca sa stabileasca o identitate ntre valoarea
variabilei sale si valoarea asociata unei instructiuni case. Se vor executa instructiunile asociate
primei instructiuni "case" pentru care identitatea respectiva este valabila.
Daca valoarea variabilei din instructiunea switch nu corespunde nici uneia din valorile asociate
instructiunilor case, se vor executa instructiunile asociate instructiunii default, daca exista o
asemenea instructiune (ne este obligatorie).
Un procedeu de programare indicat consta n aceea ca fiecare instructiune case din cadrul unei
instructiuni switch sa se ncheie cu o instructiune break.
; Instructiunea break determina ncheierea executiei instructiunii switch, sare peste "case-urile"
ramase si se executa codurile care mai sunt (daca exista) dupa "switch". n absenta instructiunii
"break", executia trece la urmatoarea instructiune "case" sau "default", fapt nedorit n majoritatea
cazurilor.
Nu este necesar sa folositi numere ntregi consecutive n instructiunile case ale unei instructiuni
switch. Daca preferati, puteti folosi numere ntregi non-consecutive, numere cu virgula sau
siruri.
2. Operatorul ? :
Operatorul conditional ?:, denumit uneori "operator ternar" sau "operator ntrebare-doua
puncte", constituie o alta modalitate de a scrie decizii n PHP.
Acest operator formeaza o expresie care se poate folosi n multe contexte PHP. Iata sintaxa de
utilizare a acestuia:
Observati cum semnul ntrebarii este separat de caracterul doua puncte prin valoarea valoareTRUE.
Operatorul conditional si evalueaza expresia conditionala. Daca expresia este evaluata la
valoarea TRUE, operatorul conditional returneaza valoarea valoare-TRUE; n caz contrar,
returneaza valoarea valoare-FALSE.
De exemplu, sa luam n considerare urmatoarea instructiune de atribuire, care foloseste un
operator conditional:
Aceasta instructiune de atribuire compara valorile variabilelor $b si $c. Daca valoarea variabilei
$b este mai mare dect aceea a variabilei $c (adica TRUE), atunci variabilei $a i este atribuita
valoarea 10; n caz contrar, variabilei respective i este atribuita valoarea 20.
expresie1 se executa o singura data si anume la inceputul instructiunii; conditie este o expresie
logica ; instructiunea for se executa atita timp cat valoarea expresiei : conditie are valoarea
TRUE.
De fiecare data dupa executia instructiunilor dintre acolade se executa : expresie2.
Iata un exemplu practic de utilizare a unei instructiuni for:
<?php
$suma = 0;
for ($n=1; $n<=3; $n++) {
$suma += $n;
echo "<br /> Suma intregilor de la 1 la $n este $suma.";
}
?>
Rezultatul afisat va fi:
Suma intregilor de la 1 la 1 este 1
Suma intregilor de la 1 la 2 este 3
Suma intregilor de la 1 la 3 este 6
n exemplu se calculeaza suma ntregilor cuprinsi ntre l si 3. Pentru aceasta, mai nti se
initializeaza variabila $suma la valoarea 0. Apoi se executa o instructiune for care incrementeaza
n mod repetat valoarea variabilei $suma.
Pentru a vedea cum functioneaza mecanismul acestei instructiuni, sa examinam componentele
instructiunilor for.
Instructiunea "for" include trei expresii, care apar ntre paranteze; fiecare expresie este separata
de vecina sa printr-un caracter punct si virgula(;).
Prima expresie este expresia de initializare. Aceasta se executa atunci cnd PHP ajunge la
instructiunea for. In exemplu, expresia de initializare atribuie valoarea variabilei $n,
($n=1) variabila denumita "variabila de ciclare" sau "index".
A doua expresie este expresia de test. Aceasta este o expresie conditionala care indica
daca se executa sau nu corpul instructiunii, n general, face referire la variabila de ciclare.
In cadrul exemplului, expresia de test compara valoarea variabilei $n cu valoarea 3 ($n
<= 3).
Expresia de test este evaluata pentru prima data imediat dupa evaluarea expresiei de
initializare.
Cea de-a treia expresie este expresia pas. n general, aceasta modifica una sau mai multe
variabile la care se face referire n expresia test. n cadrul exemplului, expresia pas
incrementeaza valoarea variabilei $n ($n++).
Dupa care se trece la corpul instructiunii for, aici, instructiunea $suma += $n si echo "Suma
intregilor de la 1 la $n este $suma."; reprezinta corpul instructiunii for.
Dupa executarea corpului functiei se verifica din nou expresia de test (conditie) dintre paranteze,
daca rezultatul este TRUE se trece mai departe la expresia "pas" (a treia din paranteze) si mai
departe la corpul functiei for. Dupa aia din nou la expresia de test dintre paranteze..., pana cand
rezultatul este FALSE (in exemplu nostru, $n>3)
Instructiunea for este utila pentru numarare si executarea n mod repetat a unor actiuni.
Instructiunea while executa un set de instructiuni atita timp cit valoarea expresiei "conditie" este
adevarata:
Forma generala a instructiuni while este urmatoarea :
while(conditie) {
Instructiune(1);
Instructiune(2);
Instructiune(3);
.............
}
Setul de instructiuni Instructiune(1), Instructiune(2), etc... se vor executa atita timp cit valoarea
expresiei logice "conditie" are valoarea TRUE.
Sa studiem un exemplu practic:
<?php
$n = 0;
$suma = 0;
while ($n <= 3) {
$suma = $suma +$n;
$n++;
}
echo "Suma este $suma";
?>
In scriptul de mai sus avem la inceput (in afara lui "while") $n = 0 si $suma = 0, se verifica
conditia din paranteza a functiei while ($n<=3), cum aceasta este TRUE (deoarece la aceasta
etapa $n = 0), se trece la executarea corpului functiei unde : $suma = $suma + $n si $n++ (adica
$n = $n + 1), astfel acum $n va fi egal cu 1, se verifica din nou conditia din paranteze, care este
TRUE ($n fiind acum egal cu 1), se executa iar corpul functiei..., si tot asa se executa aceasta
"bucla" pana cand la verificarea conditiei din paranteze rezultatul este FALSE, in acest moment
se incheie executia functiei while si se trece mai departe la urmatoarea functie (in cazul nostru:
echo "Suma este $suma";, unde dupa executia functiei while $suma a devenit egala cu 6).
In browser va aparea urmatorul rezultat:
Suma este 6
do {
Instructiune(1);
Instructiune(2);
Instructiune(3);
.............
} while(conditie);
Iata exemplul prezentat la functia while, de data aceasta folosind functia do while :
<?php
$n = 0;
$suma = 0;
do {
$suma = $suma +$n;
$n++;
} while ($n <= 3);
echo "Suma este $suma";
?>
1. Utilizarea matricelor
Deseori este convenabila stocarea mai multor valori ntr-o variabila. O asemenea variabila se
numeste matrice (Array sau "tablou"), iar valorile individuale se numesc elementele matricei.
Aici, "matrice", "Array" sau "tablou" reprezinta acelasi lucru (in varianta engleza: Array), fapt
pentru care vom folosi orcare dintre aceste denumiri.
Fiecare element al unei matrici are doua elemente importante: cheia si valoarea elementului.
Matricele pot fi create folosind doua medode principale:
2 - folosind sintaxa array() despre care am vorbit in Lectia 2 despre tipul variabilelor.
$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];
$preferinte[Nelu] = "cirese";
$preferinte[Radu] = "mere";
$preferinte[Gabi] = "pere";
Deoarece valoarea cheilor nu a fost specificata, acestea vor fi automat trecute de program ca
numere intregi consecutive, incepand de la "0" (prima cheie va avea valoarea '0', a doua cheie va
avea valoarea '1', ...)
Aceasta instructiune creeaza o matrice care contine urmatoarele asocieri:
0 => Perl
1 => PHP
2 => Python
Daca doriti sa asociati unei valori o anumita cheie, puteti folosi operatorul =>, astfel:
10 => Perl
11 => PHP
12 => Python
Ca si n cazul utilizarii unei instructiuni de atribuire pentru crearea unei matrice valorile cheilor
nu trebuie sa fie consecutive si nici macar ntregi:
2. Matrici multi-dimensionale
Este posibil ca un element al matricei sa fie de asemenea o matrice. In acest caz avem de-a face
cu o matrice multi-dimensionala.
Sa luam un exemplu practic :
<?php
$multiDimArray[firstLine] = array(1=>10, 2=>20, "a"=>"alpha");
$multiDimArray["nextLine"] = array(1=>20, 2=>40, "b"=>"beta");
echo "<br />".$multiDimArray["firstLine"][1];
echo "<br />".$multiDimArray["nextLine"][1];
echo "<br />".$multiDimArray["firstLine"][2];
echo "<br />".$multiDimArray["firstLine"]["a"];
echo "<br />".$multiDimArray["nextLine"]["b"];
?>
Sau putem scrie acelasi script si astfel (rezultatul e acelasi) :
<?php
$multiDimArray = array("firstLine"=>array(1=>10, 2=>20, "a"=>"alpha"),
"nextLine"=>array(1=>20, 2=>40, "b"=>"beta"));
echo "<br />".$multiDimArray["firstLine"][1];
echo "<br />".$multiDimArray["nextLine"][1];
echo "<br />".$multiDimArray["firstLine"][2];
echo "<br />".$multiDimArray["firstLine"]["a"];
echo "<br />".$multiDimArray["nextLine"]["b"];
?>
Rezultatul afisat va fi urmatorul :
10
20
20
alpha
beta
In exemplul de mai sus am declarat un array cu 2 linii si 3 coloane. Prima linie este identificata
de array-ul cu numele "fisrtLine", iar ce-a de-a doua linie este identificata de "nextLine".
Puteti obtine acces la valoarea asociata cheii 2 prin intermediul unei instructiuni ca aceasta:
$y = 3*$x[2];
Similar, puteti modifica valoarea asociata cheii 3 prin intermediul unei instructiunu ca aceasta:
$x[3] = 101;
4. Parcurgere Array
Uneori, n loc de a obtine accesul la un singur element al unui tablou sau de a-l modifica, doriti
sa obtineti accesul la mai multe elemente ale tabloului. De exemplu, sa presupunem ca doriti sa
determinati daca n tablou exista o anumita cheie sau valoare. Sau sa presupunem ca tabloul
reprezinta preturi si doriti sa micsorati fiecare valoare cu 10 procente. Operatii de acest gen
implica parcurgerea iterativa a tabloului sau, altfel spus, accesul la fiecare element al tabloului.
- Parcurgerea unui Array secvential
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++) {
Instructiunea break
Observati ca parcurgerea continua chiar si dupa gasirea valorii cautate.
Cnd se cauta ntr-un tablou, executia cautarii poate fi oprita dupa gasirea elementului dorit;
continuarea parcurgerii in Array nu face dect sa iroseasca resursele calculatorului, fara a afecta
rezultatele operatiei.
Pentru a opri executia unei parcurgeri, puteti folosi instructiunea break, care determina
ncheierea imediata a buclei care o contine.
Iata cum se poate revizui exemplul anterior, astfel nct sa includa o instructiune break:
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$cauta = PHP; // se cauta in tabloul $limbaje valoarea $cauta
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
echo "<br />Determinarea unei identitati cu $limbaje[$i]";
if ($cauta == $limbaje[$i]) {
echo "<br />$cauta este un limbaj excelent.";
break;
}
}
?>
Acum, dupa stabilirea unei identitati, instructiunea break provoaca sistarea buclei for.
Iata datele de iesire rezultate, care acum omit examinarea inutila a elementului tabloului asociat
cu limbajul "Python":
Determinarea unei identitati cu Perl
Determinarea unei identitati cu PHP
PHP este un limbaj excelent.
Instructiunea continue
O instructiune corelata cu instructiunea break este continue.
Instructiunea continue opreste secventa curenta a buclei, determinnd evaluarea imediata a
expresiilor de incrementare si de test.
Ca un exemplu, sa presupunem ca doriti sa cautati n tabloul $limbaje pentru a determina
numarul limbajelor care au nume scurte, adica nume alcatuite din maximum 4 caractere. Iata un
exemplu care executa aceasta prelucrare a datelor:
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$scurt = 0;
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
$n = strlen($limbaje[$i]);
echo "<br />$limbaje[$i] are $n caractere lungime";
if ($n > 4) continue;
$scurt++;
}
echo "<br />Au fost gasite $scurt limbaje cu nume scurte.";
?>
O instructiune de atribuire stabileste valoarea initiala a variabilei $scurt la zero, folosita pentru a
numara numele scurte gasite.
Instructiunea for se aseamana celor folosite anterior. Corpul acestei instructiuni difera, desigur,
de cele folosite anterior. Valoarea variabilei $n este stabilita ca fiind egala cu numarul
caracterelor care compun numele limbajului, folosind functia strlen(), care calculeaza lungimea
unui sir.
Daca instructiunea if stabileste ca elementul curent al tabloului face referire la un limbaj cu nume
lung, se executa instructiunea continue.
Instructiunea continue determina trecerea parcurgerii la urmatorul element din tablou, fara a mai
executa expresia "$scurt++"; daca nu au mai ramas elemente n tablou, bucla for si ncheie
executia.
La finalizarea parcurgerii, o instructiune echo afiseaza numarul numelor scurte de limbaje gasite
n tablou. Iata rezultatul:
Perl are 4 caractere lungime
PHP are 3 caractere lungime
Python are 6 caractere lungime
Au fost gasite 2 limbaje cu nume scurte.
- O lista cu 37 functii utile in lucrul cu Array gasiti la pagina -> Functii pentru Array
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));
// Va afisa:
?>
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));
// Va afisa:
Array ( [0]=>Array ( [0]=>a [1]=>b ) [1]=>Array ( [0]=>c [1]=>d )
[2]=>Array ( [0]=>e ) )
?>
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);
// Va afisa:
?>
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:
?>
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);
// Va afisa:
?>
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);
// Va afisa:
?>
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("a"=>1, 3);
// 4
13. array_product(array)
- Returneaza produsul elementelor din "array"
<?php
$aray = array(1, 2, 3, 4);
echo array_product($aray);
?>
// 24
tutorial - 8 - php -
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 )
?>
16. array_search("val", array)
- Returneaza cheia din "array" care are valoarea "val", sau FALSE daca nu exista. Cautarea e
"case-sensitive"
<?php
$aray = array(1, 2, 3, 'a', 'b'=>'c');
$re = array_search('c', $aray);
echo $re;
?>
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);
// $aray va avea acum:
echo $re;
?>
array(3, 4);
// 1
<?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:
?>
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);
// $aray va deveni:
?>
23. asort(array)
- Sorteaza un "array" cu valorile ordonate in ordine alfabetica, 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);
// $aray va deveni:
?>
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
?>
27. implode("separator", array);
- Transforma "array" in sir (string), adaugand valorile intr-un sir, separate de ceea ce e specificat
la "separator".
<?php
$aray = array('www', 'marplo', 'net');
$sir = implode('.', $aray);
echo $sir;
?>
// www.marplo.net
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);
// $aray va deveni:
?>
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);
// $aray va deveni:
?>
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);
// $aray va deveni:
?>
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);
// $aray va deveni:
?>
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
?>
Sortarea matricelor
- Instructiunea parcurge n mod iterativ (element cu element) tabloul denumit "tablou", stabilind
valori adecvate pentru valorile variabilelor "$cheie" si "$valoare" aferente fiecarui element al
tabloului.
Iata un exemplu simplu:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
foreach ($limbaje as $index => $limbaj) { // parcurge iterativ tabloul
echo "<br />$index =>$limbaj";
}
?>
- Remarcati ca instructiunea echo face pur si simplu referire la valorile variabilelor $index si
$limbaj, carora li se atribuie n mod automat valorile cheii, respectiv elementului curent.
10 =>Perl
20 =>PHP
21 =>Python
Cateodata este nevoie sa parcurgem datele unui tablou multi-dimensional.
Pentru a parcurge matricea, folositi instructiuni foreach imbricate:
Pentru a invata modul de parcurgere a unui Array multi-dimensional, sa studiem urmatorul
exemplu:
<?php
$date = array("PHP"=>array("simplu", "popular"), "Python"=>array("simplu", "nepopular"),
"Pearl"=>array("dificil", "popular"));
foreach ($date as $limbaj => $valoare) {
foreach($valoare as $cheie =>$caracteristica) {
echo "<br />$limbaj : $caracteristica";
}
}
?>
- Instructiunea foreach exterioara obtine cate un Array asociat cu fiecare limbaj; a doua
instructiune foreach, interioara, parcurge fiecare Array obtinut de prima instructiune foreach.
Iata rezultatul:
PHP : simplu
PHP : popular
Python : simplu
Python : nepopular
Pearl : dificil
Pearl : popular
3. Functia key()
Functia key() este corelata cu functia current(). Daca functia current() returneaza valoarea
asociata elementului curent, functia key() returneaza cheia asociata elementului curent.
Iata un exemplu care ilustreaza modul de operare al acestei functii:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
$curent = current($limbaje);
$cheie = key($limbaje);
echo "<br />functia current() a returnat $curent";
echo "<br />functia key() a returnat $cheie";
?>
Iata datele de iesire ale exemplului:
functia key() a returnat 10
4. Functia each()
O alta functie utila n parcurgerea tablourilor este each().
Functia each() returneaza perechea "cheie-valoare" care se afla la pozitia curenta din tabloul
specificat. Perechea "cheie-valoare" este returnata sub forma unui Array asociativ cu patru
elemente, dupa cum urmeaza:
Cheie
Valoare
5. Functia list()
O alta functie utila n lucrul cu tablouri este functia list(), aceasta va permite sa atribuiti valori la
numeroase variabile n cadrul unei instructiuni.
Functia list() este deseori folosita cu functia each(), deoarece functia list() faciliteaza accesul
separat la cheia si la valoarea returnate de functia each().
Forma generala de utilizare a functiei list() este urmatoarea:
list($var1, $var2, .., $varn) = valoare_tablou;
Fiecare dintre variabilele specificate, de la $var1 la $varn, primeste o valoare din tabloul
"valoare_tablou".
ntr-un fel, functia list() este opusa functiei array(), deoarece functia list() mparte un tablou
ntr-o serie de valori scalare, n timp ce functia array() construieste un tablou dintr-o serie de
valori scalare.
Iata un exemplu care ilustreaza modul de utilizare a functiei list():
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
list($cheie, $valoare) = each($limbaje);
echo "<br />cheie = $cheie, valoare = $valoare";
$urmator = next($limbaje);
echo "<br />urmator = $urmator";
?>
Iata datele de iesire ale exemplului:
cheie = 10, valoare = Perl
urmator = Python
PHP contine peste 40 de functii pentru lucrul cu tablourile. De exemplu, functia array_search()
faciliteaza cautarea ntr-un tablou.
Pentru informatii despre aceasta functie si despre alte functii utilizate n lucrul cu tablouri,
vizitati site-ul www.php.net.
6. Sortarea tablourilor
Sortarea reprezinta o alta operatie frecvent aplicata tablourilor. PHP furnizeaza o suita de functii
care faciliteaza sortarea unui tablou.
De exemplu, un tablou poate fi creat dupa cum urmeaza:
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
Apoi, doriti sa sortati tabloul n ordine alfabetica, in functie de numele limbajului de programare.
0 => PHP
1 => Perl
2 => Python
Observati ca secventa de sortare sau secventa de aranjare (cum este numita uneori) este sensibila
la diferenta ntre majuscule si minuscule. Deoarece litera "H" mare este sortata inaintea literei
"e" mic, PHP apare nainte de Python n datele de iesire sortate.
Iata un exemplu practic de folosire a functiei sort() :
<?php
$arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan');
sort($arr);
foreach($arr as $key=>$nume) {
echo "<br />Cheie=$key Valoare=$nume";
}
?>
Rezultatul afisat este urmatorul :
Cheie=0 Valoare=Avram
Cheie=1 Valoare=Cristian
Cheie=2 Valoare=Dan
Cheie=3 Valoare=Popescu
- Se observa ca instructiunea sort($arr) sorteaza matricea $arr dupa campul valoare (oridine
alfabetica).
- Observam de asemenea ca valorile campului cheie a fost alterata, fara sa conteze valoarea sau
ordinea cheilor.
Daca dorim sa sortam in ordine inversa alfabetic, folosim functia rsort()
Iata acelasi exemplu, da cu functia rsort()
<?php
$arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan');
rsort($arr);
foreach($arr as $key=>$nume) {
echo "<br />Cheie=$key Valoare=$nume";
}
?>
Acum rezultatul afisat este urmatorul :
Cheie=0 Valoare=Popescu
Cheie=1 Valoare=Dan
Cheie=2 Valoare=Cristian
Cheie=3 Valoare=Avram
Functie
sort()
Rezultat
0 => PHP
1 => Perl
2 => Python
20 => PHP
10 => Perl
21 => Python
0 => Python
1 => Perl
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
ksort - Sortarea unui tablou n functie de cheie, in ordine ascendenta
10 => Perl
20 => PHP
21 => Python
21 => Python
20 => PHP
10 => Perl
foreach($limbaje as $key=>$nume) {
echo "<br />$key => $nume";
}
Functia strcmpcase() este o functie din biblioteca PHP care compara doua siruri fara a tine cont
de majuscule sau minuscule. Functia returneaza o valoare negativa daca primul sir este mai mic
dect al doilea, zero daca sirurile sunt identice, respectiv o valoare pozitiva daca primul sir este
mai mare dect al doilea.
Rezultatul va fi :
0 => Perl
1 => PHP
2 => Python
Pentru mai multe informatii despre functia usort() si despre functiile sale conexe, examinati siteul www.php.net
- 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:
- 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
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.
rand()
echo $nr;
Cnd se produce o eroare n timpul executiei unei functii, PHP genereaza mesaje de eroare.
Uneori, asemenea mesaje de eroare sunt nedorite. n acest caz, puteti suprima generarea
mesajelor de eroare prin adaugarea in fata numelui functiei a caracterului @.
De exemplu,, pentru a suprima mesajele de eroare care pot aparea n timpul executiei functiei
"f()", scriem aceasta functie dupa cum urmeaza:
y = @f(x);
Totusi, indicat este sa scrieti scripturi care sa nu genereze erori, ascunderea lor nu rezolva
problema ce cauzeaza eroarea.
O functie utila, recomandata a fi folosita in script-uri este functia isset() si este cel mai des
folosita cu "if()".
isset() preia ca argument de obicei o variabila si arata daca aceasta a fost sau nu setata.
De exemplu: isset($nr)
- Functia returneaza TRUE daca variabila "$nr" are setata o valoare (diferita de NULL), in caz
contrar returneaza FALSE.
Aceasta functie este foarte utila in determinarea caror comenzi sa fie executate in functie daca o
anumita variabila a fost setata sau nu. Previne aparitia unor erori care apar in cazuri de variabile
nule si ajuta si la securitate.
De exemplu, sa presupunem ca avem un cod PHP care vrem sa fie executat numai daca prin
adresa URL o fost transmisa o variabila "id", adica o adresa de forma
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.');
}
require("nume_fisier")
Cnd este ncarcat un script PHP care contine o instructiune require, continutul fisierului
specificat este inserat si executat n script, nlocuind instructiunea require.
De exemplu, sa presupunem ca realizam un site in PHP care este alcatuita din mai multe pagini,
iar fiecare pagina contine in partea de sus acelasi cod HTML. In loc sa scriem de fiecare data,
pentru fiecare pagina, acelasi cod HTML, il scriem o singura data intr-un fisier separat (de
exemplu "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.
function nume_functie(nume_argument) {
Aici se insereaza corpul functiei
}
<?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
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.
1. abs(nr)
- Returneaza valoarea absoluta (cu +) a lui "nr".
<?php
echo abs(-7.8);
echo abs(3);
echo abs(-5);
?>
// 10010
3. bindec('sir_binar')
- Returneaza echivalentul numeric (decimal) al sirului binar din parametrul "sir_binar".
<?php
echo bindec('10010');
echo bindec('1000');
?>
// 18
// 8
4. ceil(nr)
- Returneaza valoarea rotunjita a lui "nr" la urmatorul (mai mare) intreg.
<?php
echo ceil(7.8);
echo ceil(5);
echo ceil(-2.3);
echo ceil(1.2);
?>
// 8
// 5
// -2
// 2
5. cos(radian)
- Returneaza valoarea cosinus a gradelor de cerc specificate la "radian".
<?php
echo cos(30);
echo cos(90);
?>
// 0.15425144988758
// -0.44807361612917
6. decbin(nr)
- Returneaza un sir cu valoarea binara a numarului "nr".
<?php
echo decbin(-5);
echo decbin(88);
?>
// 11111111111111111111111111111011
// 1011000
7. dechex(nr)
- Returneaza un sir cu valoarea hexazecimala a numarului "nr".
<?php
echo decbin(-5);
echo decbin(88);
?>
// fffffffb
// 58
8. decoct(nr)
- Returneaza un sir cu valoarea octala a numarului "nr".
<?php
echo decbin(-5);
echo decbin(88);
?>
// 37777777773
// 130
9. floor(nr)
- Returneaza valoarea rotunjita a lui "nr" la anteriorul (mai mic) intreg.
<?php
echo floor(7.8);
echo floor(5);
echo floor(-2.5);
echo floor(1.2);
?>
// 7
// 5
// -3
// 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);
?>
11. hexdec('hex')
- Returneaza valoarea zecimala a sirului hexazecimal "hex".
<?php
echo hexdec('ee');
echo hexdec('3fe');
?>
12. hypot(c1, c2)
// 238
// 1022
- Returneaza lungimea ipotenozei unui triunghi dreptunghic care are lungimea catetelor "c1" si
"c2".
<?php
echo hypot(3, 4);
?>
// 5
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
// 2
<?php
echo max(9, 3, 8, 78, 55);
?>
// 78
// 3
// 47
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();
echo M_PI;
?>
// 3.1415926535898
// 3.1415926535898
// 64
23. round(nr)
- Returneaza valoarea rotunjita a lui numar la intregul ce mai apropiat.
<?php
echo round(7.8);
echo round(5);
echo round(-2.5);
echo round(1.2);
?>
// 8
// 5
// -3
// 1
24. sin(radian)
- Returneaza valoarea sinus a gradelor de cerc specificate la "radian".
<?php
echo sin(30);
echo sin(90);
?>
// -0.98803162409286
// 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);
echo tan(90);
?>
// -6.4053311966463
// -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";
10.666666666667
?>
Variabile globale
Variabile locale
Variabilele globale sunt create n exteriorul functiei, n timp ce variabilele locale sunt create n
interiorul unei functii.
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
$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.
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 cnd este executata
functia.
4. Utilizarea referintelor
In mod prestabilit, argumentele transferate unei functii PHP sunt transmise prin valoare, ceea ce
nseamna ca valorile argumentelor sunt copiate si functiile utilizeaza copii ale valorilor
argumentelor lor, nu argumentele n sine. Ca o consecinta, o functie PHP nu poate modifica
valorile argumentelor sale.
Totusi, puteti stabili ca o functie sa aiba posibilitatea de a modifica valoarea unui argument,
specificnd ca argumentul sa fie transferat prin referinta.
Cnd un argument este transferat prin referinta, valoarea sa nu este copiata; functia lucreaza cu
valoarea argumentului si are libertatea de a modifica acea valoare.
Pentru a specifica faptul ca un argument urmeaza a fi transferat prin referinta, inaintea
argumentului va fi adaugat un caracter ampersand (&). Puteti atasa acest caracter la argument n
antetul functiei sau n apelul la functie.
Iata un exemplu care prezinta apelul prin valoare si apelul prin referinta:
<?php
function p_valoare($a) {
$a = 1;
}
function p_referinta(&$a) {
$a = 1;
}
$b = 0;
p_valoare($b);
echo "<br /> \$b = $b";
$b = 0;
p_valoare(&$b);
echo "<br /> \$b = $b";
$b = 0;
p_referinta($b);
echo "<br /> \$b = $b";
?>
Dupa rulati acest script, veti obtine urmatoarele date de iesire:
$b = 0
$b = 1
$b = 1
Retineti ca scriptul contine doua functii, si anume "p_valoare()" si "p_referinta()". Fiecare
functie preia un singur argument, denumit $a. Antetul functiei "p_referinta()" specifica faptul ca
argumentul sau este transferat prin referinta; argumentul functiei "p_valoare()" este transferat
prin valoare.
Primul paragraf al programului invoca functia "p_valoare()", transfernd argumentul prin
valoare. n consecinta, functia lucreaza cu o copie a argumentului sau, iar valoarea variabilei $b
nu se modifica.
Cel de-al doilea paragraf al programului invoca de asemenea functia "p_valoare()"; dar, foloseste
un caracter ampersand (&) pentru a determina transferul prin referinta al valorii variabilei $b. n
consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 n 1.
Cel de-a treilea paragraf al programului invoca functia "p_referinta()". Antetul functiei respective
foloseste un caracter ampersand (&) pentru a specifica faptul ca valoarea argumentului sau este
transferata prin referinta, n consecinta, functia modifica valoarea argumentului sau, care se
transforma din 0 n l.
Prin utilizarea referintelor se evita suprasarcina de copiere a valorilor argumentelor si implicit se
obtine o viteza mai mare de executie a programului. Cu toate acestea, programele devin astfel
mai dificil de nteles, iar referintele sau apelurile prin referinta pot cauza erori de program. Cel
mai indicat este sa evitati referintele, acolo unde este posibil, si sa definiti functii care returneaza
valori, si nu functii care modifica valorile propriilor argumente.
In versiunile PHP 5+, transmiterea la functiei a unui parametru prin referinta "Call-time pass-byreference", 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".
n Lectia 2 au fost prezentate sirurile, tipul de date PHP care stocheaza texte, n aceasta lectie
veti nvata mai multe despre utilizarea sirurilor.
Valorile de tip sir sunt secvente de caractere incluse ntre ghilimele duble sau simple
Puteti include un caracter special n cadrul unui sir folosind o secventa escape care
reprezinta caracterul special.
Variabilele pot fi de tip string si li-se poate atribui o valoare de tip sir.
PHP poate converti n mod automat o valoare numerica ntr-un sir, respectiv valoarea
unui sir ntr-un numar.
putere a lui 10. De exemplu, numarul zecimal 123 are valoarea l x 10 la puterea 2 + 2 x 10 la
puterea 1 + 3 x 10 la puterea 0 = 1x100 + 2x10 + 3x1.
Puteti determina valoarea unui numar reprezentat folosind o alta baza prin nlocuirea lui 10 cu
valoarea bazei respective ntr-o expresie ca aceea prezentata anterior. De exemplu, valoarea
hexazecimala 123 este echivalenta cu valoarea zecimala l x 16 la puterea 2 + 2 x 16 la puterea 1
+ 3 x 16 la puterea 0 = l x 156 + 2 x 16 + 3 x l = 291.
Similar, valoarea n octal 123 este echivalenta cu valoarea zecimala 1x8 la puterea 2 + 2x8 la
puterea 1 + 3x8 la puterea 0 = 1x64 + 2x8 + 3xl=83.
Daca vi se pare complicat sa calculam astfel, nu intrati n panica; n continuare veti nvata sa
determinati valoarea n octal sau hexazecimal echivalenta cu orice valoare zecimala, folosind
functii PHP.
$hex = dechex($i);
echo "<br /> $i (octal $octal, hex $hex): caracter - $c";
}
?>
Scriptul va afisa urmatorul rezultat:
33 (octal 41, hex 21): caracter - !
34 (octal 42, hex 22): caracter - "
35 (octal 43, hex 23): caracter - #
36 (octal 44, hex 24): caracter - $
37 (octal 45, hex 25): caracter - %
38 (octal 46, hex 26): caracter - &
39 (octal 47, hex 27): caracter - '
$num = 13;
$tip = 'PHP';
printf($sir, $num, $tip);
?>
- Includerea datelor formatate in sir se face in ordinea adaugarii variabilelor intre parantezele
functiei "sprintf()".
- Va afisa "Aceasta este lectia 13 din cursul PHP".
Sirul de formatare consta dintr-o serie de caractere si directive ordinare. Un caracter ordinar este
orice caracter, n afara caracterului "%". Caracterele ordinare sunt pur si simplu copiate la iesire.
Directivele reprezinta secvente de caractere care ncep cu simbolul "%"; aceste determina modul
n care va fi formatat argumentul corespunzator.
O directiva simpla, cum este cea din exemplul precedent, poate consta dintr-un caracter "%"
urmat de un specificator de tip, precum "d", care arata ca argumentul trebuie tratat ca numar
zecimal. Cu toate acestea, o directiva mai sofisticata poate include urmatoarele componente, care
trebuie sa apara n ordinea indicata:
Descriere
Valoare
Format
Rezultat
100
%d
100
100
%b
1100100
100
%o
144
100
%x
64
100
%f
100.000000
12.345
%^-10f
12.345000^^^^^^^^
12.345
%^10f
^^^^^^^^12 .345000
12.345
%^-10.2f
12.35^^^^^^^^
12.345
%10.2f
^^^^^^^^12.35
test
%^-10s
test^^^^^^
test
%^10s
*^^^^^^test
Daca utilizarea functiilor printf() si sprintf() pentru formatarea numerelor pare cam greoaie,
puteti folosi functia number_format(), care returneaza o valoare de tip sir continnd un rezultat
formatat. Puteti apela functia cu unul, doua sau patru argumente:
number_format(numar)
number_format(numar, zecimale)
1. Manipularea sirurilor
PHP contine peste 70 de functii care lucreaza cu siruri. Aceasta sectiune descrie cateva functii pe
care este posibil sa le utilizati frecvent. Aceste functii va permit sa obtineti lungimea unui sir, sa
eliminati dintr-un sir caracterele de tip spatiu alb, sa convertiti caracterele unui sir n majuscule
sau minuscule si altele.
- Functia strlen() returneaza lungimea sirului specificat ca argument al functiei.
Iata un exemplu simplu de utilizare a functiei strlen():
<?php
$s = "Acesta este un sir";
$n = strlen($s);
echo "<br /> Lungimea sirului este: $n";
?>
Scriptul de mai sus va afisa:
Lungimea sirului este: 18
- Numeroase functii PHP va permit sa eliminati caracterele de tip spatiu alb de la una sau ambele
extremitati ale unui sir.
Iata un exemplu; care prezinta modul de operare al acestor functii:
<?php
$s = "
Acesta este un sir
";
$n = strlen($s);
echo "<br /> Lungimea sirului este: $n";
$trim =chop($s);
// Elimina spatiile albe din partea dreapta a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
$trim = ltrim($s);
// Elimina spatiile albe din partea stanga a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
$trim = rtrim($s);
// Elimina spatiile albe din partea dreapta a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
$trim = trim($s);
// Elimina spatiile albe din ambele parti a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
?>
Scriptul de mai sus va afisa:
Lungimea sirului este: 36
Lungimea sirului este: 27
Lungimea sirului este: 27
Lungimea sirului este: 27
Lungimea sirului este: 18
Descriere
chop(s)
ltrim(s)
rtrim(s)
trim(s)
2. Compararea sirurilor
PHP furnizeaza patru functii care sunt deosebit de utile pentru compararea sirurilor. Aceste
functii sunt enumerate n tabelul urmator.
Fiecare functie returneaza o valoare al carei semn determina rezultatul comparatiei; nu trebuie sa
ncercati sa interpretati valoarea returnata efectiva.
Functii PHP de comparatie ntre siruri
Functia
Descriere
strcasecmp(s1, s2)
strcmp(s1, s2)
strncmp(s1,s2, n)
Descriere
strchr(s1,s2)
stristr(s1,s2)
strpos(s1,s2)
strrchr(s1,s2)
strstr(s1,s2)
$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
Sa presupunem ca doriti sa specificati un sir care poate include orice vocala. Puteti face aceasta
folosind expresia regulata [aeiou]. Prin includerea valorilor posibile ntre paranteze, formati o
expresie regulata echivalenta cu formularea "alege oricare din aceste valori". Daca doriti sa
permiteti si utilizarea, majusculelor, puteti scrie [aeiouAEIOU].
Sa presupunem ca doriti sa specificati un sir care poate include orice caracter scris cu minuscule.
Puteti scrie: [abcdefghijklmnopqrstuvwxyz]. Sau puteti folosi o forma mai compacta [a-z],
unde prin cratima se ntelege "o serie de caractere consecutive".
Sa presupunem ca doriti sa specificati intr-o expresie regulata sirurile "sat", "mat" si "lat". Pentru
aceasta, aveti nevoie de expresia regulata [sml]at. Semnificatia acestei expresii regulate este
urmatoarea: "alege oricare din literele 's', 'm' si 'l' si scrie dupa litera respectiva literele 'at'".
Daca un accent circumflex (^) este primul simbol mentionat ntre parantezele drepte, acesta are
ca efect inversarea semnificatiei expresiei regulate plasate ntre paranteze.
De exemplu, expresia regulata [^a-z] corespunde oricarui caracter care nu este o litera
mica.
Pentru a specifica faptul ca o expresie regulata se poate repeta, expresia regulat va fi urmata de o
pereche de acolade, care includ limitele superioara si inferioara ale repetitiei.
De exemplu, expresia regulata [aeiou]{1,4} corespunde sirurilor care pot contine intre 1
si 4 vocale.
Pentru a specifica repetarea mai multor parti ale unei expresii regulate, includeti partile
respective ntre paranteze rotunde.
De exemplu, expresia regulata ([sml]at){1 ,2} corespunde unui numar de una sau doua
repetari ale oricaruia dintre sirurile "sat", "mat" sau "lat".
Pentru a simplifica scrierea de reguli intr-o expresie regulata se folosesc anumite caractere
"speciale"
Sa presupunem ca doriti sa reprezentati o nmultire intre doua numere, puteti obtine ceva de
genul [0-9]*[0-9]. Totusi, aceasta expresie regulata nu are semnificatia dorita, deoarece '*' este
un factor de repetitie, nu un caracter dintr-un sir. Pentru a dezactiva semnificatia speciala a
caracterului '*', trebuie sa-l prefixati cu un caracter backslash: [0-9]\*[0-9].
Pentru a specifica faptul ca o expresie regulata corespunde numai unui sub-sir care include
anumite caractere la inceput, prefixati expresia regulata cu un accent circumflex "^". De
exemplu, expresia regulata ^[sml]at corespunde sub-sirurilor "sat", "mat" sau "lat" numai daca
acestea apar la nceputul sirului subiect.
Similar, pentru a arata ca o expresie regulata corespunde numai unui sub-sir care include anumite
caractere la sfarsit, anexati la expresia regulata un simbol al dolarului "$". De exemplu, expresia
regulata [sml]at$ corespunde sirurilor "sat", "mat" sau "lat" numai daca acestea apar la sfrsitul
sirului subiect.
Iata o lista cu mai multe caractere speciale si rolul lor in expresiile regulate:
+ - 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)
(.*) - Reprezinta toate caracterele (prin .) repetate de cate ori e posibil (dat de *)
^The .* hack$ - Sirurile care incep cu "the " si se sfarsesc cu " hack"
^www.[a-z0-9]+.ro$ - Reprezinta sirurile "www.---.ro" unde '---' poate fi orice litera sau
cuvant ce contine litere mici si numere
^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})$ - Expresie
regulata pentru adrese de e-mail
Descriere
- Executa o identificare cu o expresie regulata (deprecata incepand cu
versiunea PHP 5.3 si anulata la PHP 6)
sql_regcase
Expresiile regulate compatigile Perl se adauga intre caractere "/". De exemplu sablonul ([a-z09]+) se foloseste /([a-z0-9]+)/.
Iata un exemplu cu preg_grep(), aceasta returneaza un array compus din elementele unei matrice
care contin sablonul, expresia regulata cautata. Acest exemplu va returna doar acele elementele
dintr-o matrice care contin in ele sub-sirurile "casa" sau "masa".
<?php
$matrice = array('123casa', 'abc masa', '12-xy', '$asa_0/', '123abc casa');
$filtru = preg_grep("/([cm]asa)/", $matrice);
print_r ($filtru);
// Afiseaza elementele matricei
?>
- Variabila "$matrice" contine un Array cu mai multe elemente cu siruri.
- In variabila $filtru e preluat rezultatul functiei "preg_grep()" a carei prim parametru este un
sablon de expresie regulata (adaugata intre ghilimele duble), iar al doilea este matricea in care e
cautat sablonul.
- Cu functia "print_r()" se va afisa elementele matricei obtinute in variabila "$filtru". Rezultatul
afisat e urmatorul:
Array ( [0]=>123casa [1]=>abc masa [4]=>123abc casa )
- Un ultim exemplu util, folosim functia preg_replace() si o expresie regulata pentru a elimina
caracterelor speciale dintr-un sir
<?php
$sir = 'Sir& ce contine*a <caractere: speciale? /in co@nte>xt';
$sir = preg_replace("/([^ A-Za-z0-9_]+)/", "", $sir);
echo $sir;
?>
In acest exemplu avem un sir (stocat in variabila $sir) ce contine diferite caractere mai putin
uzuale.
Functia "preg_replace", impreuna cu expresia regulata "/(^ A-Za-z0-9_]+)/", pastreaza in $sir
numai literele, cifrele, caracterul '_' si spatiu.
Instructiunea "echo" va afisa urmatorul rezultat:
Sir ce continea caractere speciale in context
Valorile majoritatii variabilelor dispar atunci cnd scriptul PHP care le contine si ncheie
executia. Spre deosebire de acestea, valorile variabilelor cookie se pot pastra un timp indefinit.
Pentru ca valorile lor sa se poata pastra, browserul utilizatorului stocheaza variabilele cookie n
unitatea de hard-disc a utilizatorului.
Majoritatea navigatoarelor de Web au posibilitatea sa activeze/dezactiveze cookie-urile. Trebuie
sa tineti cont de acest lucru cand doriti sa folositi cookie in scripturile dv., totusi, comform
statisticilor, in jur de 1% dintre utilizatori au optiunea cookie dezactivata.
PHP pune la dispozitia utilizatorilor functii pentru transmiterea cookie-urilor de la server la
browser, si modalitati de citire a cookie-urilor.
Pentru a citi cooki-urile puteti utiliza variabila PHP de tip tablou $_COOKIE sau
$_HTTP_COOKIE_VARS, acestea contin numele si valoarea fiecarei variabile cookie curenta.
Daca doriti sa obtineti acces la acest tablou, puteti folosi un program ca urmatorul:
- Argumentul 'numeCookie' specifica numele variabilei cookie, iar argumentul 'valoare' specifica
valoarea variabilei.
- Valoarea variabilei cookie este automat transmisa "urlencode" si cand este primita e automat
decodata.
- Argumentul 'expirare' indica momentul expirarii variabilei cookie; dupa ora specificata,
variabila cookie nu mai este accesibila.
n general, este convenabil sa se specifice momentul expirarii folosind functia time(), care
returneaza intervalul de timp (exprimat n secunde) scurs de la 1 ianuarie 1970. Puteti adauga o
valoare de tip decalaj (offset), care specifica intervalul de timp pe durata caruia variabila cookie
trebuie sa fie accesibila.
Folosind aceasta functie se pot transmite mai multe cookie-uri succesiv; protocoalele Web
limiteaza insa la maximum 20 numarul cookie-urilor ce pot fi trimise aceluiasi utilizator.
De exemplu, sa luam n considerare urmatoarea instructiune:
Aceasta instructiune creeaza o variabila cookie denumita 'fruct', care are valoarea 'banana'.
Variabila cookie va fi disponibila timp de o ora (3600 secunde) de la crearea sa.
Daca preferati, puteti specifica momentul expirarii folosind functia mktime(). Aceasta functie
are urmatoarea forma:
De exemplu, urmatoarea instructiune creeaza o variabila cookie care expira la o secunda dupa
miezul noptii primei zile a anului 2009:
permite sa specificati numele de domeniu asociat unei variabile cookie. n consecinta, variabila
cookie va fi disponibila numai pentru siturile Web din cadrul domeniului specificat. De exemplu,
sa presupunem ca un script din serverul Web http://www.subdomeniu.domeniu.com creeaza o
variabila cookie. n mod prestabilit, variabila cookie este disponibila numai pentru gazda
respectiva. Cu toate acestea, puteti face variabila cookie disponibila pe ntreg domeniul
'subdomeniu.domeniu.com', specificnd "subdomeniu.domeniu.com" ca valoare a argumentului
'domeniu'.
- Argumentul 'secure' este o valoare ntreaga, care specifica daca variabila cookie trebuie trimisa
prin intermediul unei conexiuni sigure (HTTPS). Specificati valoarea l pentru a mpiedica
transmiterea variabilei cookie n cazul n care conexiunea nu este sigura; pentru a permite
transmiterea variabilei cookie prin conexiuni HTTP obisnuite, specificati valoarea 0.
Descriere
file_exists()
fileatime()
filectime()
filetype()
is_dir()
is_file()
is_readable()
is_writable()
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 cte trei caractere fiecare; cu alte
cuvinte, trei triade. Prima triada indica privilegiile acordate posesorului fisierului. Cea de-a doua
triada indica privilegiile acordate membrilor grupului posesor al fisierului. Cea de-a treia triada
indica privilegiile acordate altor utilizatori.
Cele 3 caractere care alcatuiesc un grup sunt reprezentate, in sistemele UNIX, prin urmatoarele
tri litere: 'r', 'w' si 'x'; acestea reprezinta:
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--
"r-x", membrii grupului posesor al fisierului pot citi sau executa fisierul, dar nu pot scrie
n fisier
"r--", alti utilizatori pot citi fisierul, dar nu pot scrie n fisier sau executa continutul
fisierului
Privilegiul 'x' este semnificativ numai pentru fisierele care includ un continut executabil, cum
sunt fisierele binare executabile (.exe) sau anumite categorii de scripturi.
Posesorul unui fisier poate modifica privilegiile asociate fisierului emitnd comanda chmod
(aceasta functioneaza in sistemele de operare UNIX).
Aceasta comanda are doua forme. O forma va permite sa specificati privilegiile folosind cifre
scrise n octal; cealalta va permite sa le specificati folosind litere.
Pentru a specifica privilegiile folosind cifre n octal, calculati valoarea numerica a fiecarei triade.
Pentru aceasta, nsumati numerele corespunzatoare fiecarui privilegiu disponibil din cadrul
triadei. Numerele asociate privilegiilor sunt urmatoarele:
r-4
w-2
x-1
De exemplu, privilegiul "rwx" are valoarea 4 + 2 + 1 = 7. Similar, privilegiul "r-x" are valoarea 4
+ l = 5, iar privilegiul "r--" are valoarea 4.
Dupa ce ati calculat valoarea numerica a fiecarei triade, formati un numar din trei cifre scris n
octal, care este alcatuit din valoarea numerica a privilegiilor utilizatorilor, valoarea numerica a
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--" specificnd 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.
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:
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:
Sub Microsoft Windows, fisierele ASCII si fisierele binare sunt tratate n mod diferit. Cnd
deschideti un fisier binar sub Windows, specificati "b" ca al doilea caracter al modului; de
exemplu, "rb" pentru citire, "wb" pentru scriere, "a+b" pentru citire si adaugare. Daca nu
procedati astfel, citirile din fisier si alte operatii se vor ncheia prematur sau vor esua.
fclose(identificator_fisier)
$s = fread($fh, 256);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
Exemplul citeste maximum 256 de octeti din fisier daca fisierul a fost deschis.
- Am folosit caracterul @ in fata functiei "fopen()" pentru a impedica afisarea erorilor de la
server in cazul cand fisierul nu poate fi deschis. Este deja functia "if()" care verifica si afiseaza
mesaj in caz de nedeschidere a fisierului.
Pentru a citi un numar mai mare sau mai mic de octeti, modificati valoarea argumentului lungime
al functiei fread().
PHP include o functie conexa, denumita fgetc(), care citeste un octet din fisierul specificat.
Pentru a citi si a afisa ntregul continut al fisierului, puteti folosi functia filesize() pentru a
furniza valoarea argumentului lungime, astfel:
<?php
$nume = "carte.txt";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
else {
$l = filesize($nume);
$s = fread($fh, $l);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
else {
$s = fgets($fh, 126);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
- In exemplul de mai sus, daca prima linie din fisierul "carte.txt" are mai mult de 125 de
caractere, va afisa doar primele 125, daca are mai putin de 125 de caractere, va afisa doar
caracterele care sunt incluse in prima linie.
<?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.
readfile("carte.txt");
$s = fgets($fh, 256);
echo "<br /> Citeste : $s";
}
// Deruleaza la inceputul fisierului si reia redarea acestuia
rewind($fh);
while (!feof($fh)) {
$s = fgets($fh, 256);
echo "<br /> Citeste \$s : $s";
}
fclose($fh);
?>
Daca se produce vreo eroare, functia rewind() returneaza zero.
Desi functia rewind() este utila n caz de nevoie, necesitatea de a readuce un pointer de fisier la
nceputul fisierului nu este chiar att de frecventa.
Functia fseek() furnizeaza o mai mare flexibilitate, permitndu-va sa pozitionari pointerul de
fisier astfel nct sa puteti citi sau scrie n orice punct al fisierului.
Functia are doua forme, cea mai simpla fiind urmatoarea:
fseek(identificator_fisier, offset)
unde 'identificator_fisier' este identificatorul de fisier returnat de functia fopen(), iar 'offset' este
pozitia dorita a pointerului de fisier, specificata n octeti, n raport cu nceputul fisierului.
In caz de reusita, functia fseek() returneaza 0; n caz contrar, returneaza -l .
O forma alternativa a functiei asigura un grad superior de flexibilitate, avand urmatoarea forma:
fseek(identificator_fisier, offset, baza)
unde 'identificator_fisier' si 'offset' au semnificatiile definite anterior, iar 'baza' ia una ; dintre
urmatoarele valori:
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.
Aceasta forma include un al treilea argument, si anume "lungime", care va permite sa specificati
numarul maxim de octeti care vor fi scrisi.
Argumentul "lungime" al functiei fwrite() trebuie utilizat atunci cnd se scrie n fisiere binare
sub Microsoft Windows.
Windows prefera secventa de terminare a liniei "\r\n". Atunci cnd scrieti programe PHP pentru
sisteme Windows, este de preferat sa folositi secventa "\r\n" de terminare a liniei.
- PHP dispune de o alta functie pentru scrierea fisierelor, fputs(). Totusi, n afara de nume,
fputs() este similara cu functia fwrite().
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);
echo $dir;
?>
// marplo.net/php-mysql
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):
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 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");
// Parcurge fisierul pana ajunge la sfarsit (atunci "feof" e TRUE - adica "!feof" e FALSE)
while(!feof) {
}
fclose($fo);
?>
11. file_exists("fisier")
- Returneaza TRUE daca "fisier" exista, altfel, returneaza FALSE.
<?php
if (file_exist('dir/file.ext')) echo 'Fisierul exista';
else echo 'Fisierul nu exista';
?>
12. file_get_contents("fisier")
- Returneaza tot continutul din "fisier" intr-un sir. Daca "fisier" nu poate fi citit, returneaza
FALSE.
13. file_put_contents("fisier", "continut")
- Scrie in "fisier" sirul specificat la "continut". Daca fisierul exista, suprascrie datele existente,
daca nu exista, il creaza. Daca nu poate scrie in "fisier", returneaza FALSE.
<?php
$file = 'cursuri.php';
$context = file_get_contents($file);
// Preia continutul fisierului
$context .= 'Sir nou adaugat dupa cel existent';
file_put_contents($file, $context);
?>
echo $aray_file[0];
?>
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:
?>
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.
19. flock(file_pointer, flag)
- Blocheaza / deblocheaza accesul de citire sau scriere la un fisier deschis cu "fopen()", specificat
la "file_pointer". Returneaza TRUE, sau daca functia esueaza, FALSE. Modul de blocare, sau
deblocarea, se specifica la "flag", acesta putand fi:
LOCK_UN - deblocare
<?php
$fo = fopen("fisier.txt", "r+");
if (flock($fo, LOCK_EX)) {
// blocheaza alt acces la fisier pt scriere
fwrite($fo, "Scrie ceva in el.");
flock($fo, LOCK_UN);
// Elibereaza blocarea
} else {
echo "Nu poate bloca fisierul!";
}
fclose($fo);
?>
20. fseek(file_pointer, pozitie)
- Muta pozitia pointer-ului dintr-un fisier deschis cu "fopen()" la numarul de caractere specificat
de "pozitie" (0 e primul caracter). In caz de succes returneaza 0, altfel, -1.
<?php
$fo = fopen('somefile.txt', 'r+b');
fseek($fo, 199);
// Muta pointerul in fisier la al 200-lea caracter
?>
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);
?>
22. fwrite(file_pointer, 'sir')
- Scrie intr-un fisier deschis cu "fopen()" (specificat la "file_pointer") continutul din "sir".
<?php
// Daca poate deschide fisierul pt. adaugare date
if ($fo = fopen('tutorial.txt', "a+b")) {
// /www/htdocs
// index.php
// php
// index (incepand cu PHP 5.2.0)
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
?>
32. rename("nume", "nume_nou"
- Redenumeste un director sau fisier specificat la "nume", cu "nume_nou". In caz de succes
returneaza TRUE, altfel FALSE.
<?php
rename("dir/file.txt", "dir/my_file.txt");
?>
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);
// Afiseaza locatia unde e acum pointer-ul in fisier
echo ftell($fo);
// 11
rewind($fo);
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.";
?>
else {
$s = fgets($fh, 7);
$count = (int) $s;
$count = $count + 1;
rewind($fh);
fwrite($fh, $count);
echo "<br /> Nr. vizitari: $count";
fclose($fh);
}
?>
Remarcati functiile pe care le foloseste scriptul pentru a executa operatiile cu fisiere. Programul
deschide fisierul "ctr.txt" pentru citire si scriere, preia datele din acesta, care sunt un numar
intreg, mareste acel numar cu o unitate, intoarce pointerul la inceputul fisierului "rewind" dupa
care rescrie noul numar, afiseaza numarul si inchide fisierul.
Secventa de cod descrisa mai sus poate creea probleme in cazul in care, de exemplu doi
utilizatori diferiti acceseaza acelasi fisier, in acelasi timp, cand contoarul este, de exemplu, la
numarul 100. Amandoi vor incrementa numarul 100 cu o unitate si va rescrie in fisierul "ctr.txt"
101; in final, contoarul va arata 101, in loc de 102 cum ar fi trebuit (deoarece au fost 2 vizitatori).
Pentru a evita astfel de conflicte PHP pune la dispozitia utilizatorilor o metoda prin care se poate
bloca accesul temporar la un fisier. Pe durata blocarii, un alt utilizator nu va mai putea scrie/citi
din acest fisier. De aceea durata blocarii trebuie sa fie limitata.
Functia care realizeaza blocarea este flock(), care are urmatoarea forma:
flock(identificator_fisier, operatie)
Iata cum se foloseste procesul de blocare, vom folosi acelasi exemplu, contoarul de mai sus, de
data aceasta imbunatatit.
<?php
$contor = "ctr.txt";
$fh = @fopen($contor, "r+b");
if (!$fh) {
echo "Nu a fost deschis fisierul ctr.txt.";
}
else {
flock($fh, LOCK_EX);
$s = fgets($fh, 7);
}
?>
- Exemplu modifica numele fisierului "test.txt" in "teste.dat".
Alege fisierul:
<input type="file" name="fisier" /> <br />
<input type="submit" name='submit' value="Trimite" />
</form>
- Cnd utilizatorul apasa pe butonul de "Trimite", scriptul PHP preia datele si va incarca fisierul
dorit in server
Invatati sa cititi continutul unui director, sa-l redenumiti si sa creati noi directoare
Cele mai importante functii pentru utilizarea cataloagelor va permit sa obtineti catalogul de lucru
si sa lucrati cu acesta, sa manipulati cai de acces, sa cititi continutul unui director, sa vizualizati
si sa modificati privilegiile unui director, precum si sa creati si sa stergeti cataloage.
In acest context, numele "catalog" si "director" reprezinta acelasi lucru.
"plomar/curs-php/lectii".
Functia are urmatoarea forma:
dirname(cale_fisier)
Functia basename() executa operatia complementara, returnnd numai componenta finala a caii
specificate.
De exemplu, daca este data calea "plomar/curs-php/lectii/lectia1.php", functia "basename()" va
returna "lectia1.php".
Functia are urmatoarea forma:
basename(cale_fisier)
Daca doriti sa executati mai multe operatii cu o cale, functia pathinfo() va poate fi de folos.
Aceasta functie returneaza un tablou care include patru elemente (al patrule incepand de la
versiunea PHP 5.2.0):
4. filename - numele fisierului dat de rezultatului functiei basename(), dar fara extensie
php
lectia1
Rezultatul apelarii functiei readdir() este un sir care contine numele urmatorului fisier sau subdirector din catalogul deschis. Functia returneaza FALSE atunci cnd au fost citite toate intrarile
din catalog.
Iata un exemplu care prezinta modul de utilizare a acestor functii pentru citirea continutului unui
catalog:
<?php
$dc = @opendir("home/plomar/curs-php");
if (!$dc) {
echo "Directorul nu a putut fi deschis";
}
else {
while ($ok = readdir($dc)) {
echo "<br /> $ok";
}
closedir($dc);
}
?>
Datele de iesire ale exemplului pot fi similare cu cele prezentate mai jos :
style
imgs
lectia
scripts
index.php
- 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.
Lucrurile se desfasoara ca in felul urmator: in momentul cand un user s-a logat la site, PHP
atribuie acestuia un identificator unic de sesiune : SID. Acest SID este inglobat intr-un coockie
cu numele PHPSESSID si trimis apoi catre browserul utilizatorului. Daca browserul nu suporta
cookie-uri sau acestea sunt dezactivate, atunci acest SID este adaugat la adresa URL. In acelasi
timp se creeaza pe server un fisier cu numele SID. In continuare daca utilizatorul doreste sa
stocheze anumite informatii, acestea vor fi practic scrise in acest fisier SID de pe server.
Sesiunile au urmatoarele avantaje:
- Pot fi folosite chiar daca browserul utilizatorului nu suporta cookie-uri sau daca acestea
sunt dezactivate.
- Permit stocarea unui volum mare de informatii, spre deosebire de cookie-uri care sunt
limitate in aceasta privinta.
- Sunt mai sigure in raport cu cookie-urile deoarece informatiile nu sunt transmise in mod
repetat intre client si server.
session_start()
Aceasta trebuie sa fie printre primele linii de cod dintr-un script PHP, deoarece apelul acestei
functii trebuie facut inainte de trimiterii catre browser-ul Web a vreunui cod HTML sau chiar a
unui spatiu vid.
Daca folosim stocarea iesirii in buffer, instructiunea session_start() nu trebuie inserata neaparat
la inceputul codului.
Instructiunea session_start() nu este necesare daca in fisierul de configurare "php.ini", variabila
"session.auto_start" are valoarea TRUE.
Pentru a intelege mai bine modul de lucru cu sesiuni si functia session_start(), folosim un
exemplu in care avem o pagina principala "a.php" unde cream o variabila cu numele
"userName", atribuindu-i valoarea "MarPlo", pe care o stocam intr-o sesiune PHP, pagina contine
o legatura catre o alta pagina "b.php", aceasta din urma va folosi functia session_start() pentru a
prelua, prin sesiune, valoarea variabilei "user_name" din pagina "a.php", astfel putem folosi
valoarea acestei variabile intr-un script din pagina "b.php".
Continutul fisierului "a.php" este urmatorul:
<?php
//Fisierul a.php
session_start();
if(!isset($_SESSION['userName']))
$_SESSION['userName'] = "MarPlo";
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<?php
echo "<br /> Identificatorul sesiunii curente SID este:". session_id();
//Va afisa un rezultat asemanator cu: "Identificatorul sesiunii curente SID
este:2846240682abf24a09f42664fc03bbf3"
?>
Functia session_id() accepta un parametru. Astfel putem seta un anumit SID pentru sesiunea
curenta. In acest caz trebuie sa apelam functia session_id() inainte de functia : session_start(),
ca in exemplul urmator:
<?php
session_id('123abc');
session_start();
echo "<br /> Identificatorul sesiunii curente SID = ". session_id();
//Va afisa rezultatul: "Identificatorul sesiunii curente SID = 123abc"
?>
Deoarece variabilele de sesiune pot fi citite de alti utilizatori neautorizati, nu este indicat sa
pastram aici informatii esentiale cum sint parolele.
Pentru a creea un minimum de securitate putem codifica aceste informatii, folosind functtile de
codare oferite de PHP:
<?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".
unset($_SESSION);
unset($_SESSION['nume_variabila']);
Datele sesiunii sunt memorate in server in fisiere temporare. Pentru a sterge datele sesiunii din
server folositi:
session_destroy()
Nume
AnNastere
001
George Washington
1732
002
John Adams
1735
003
Thomas Jefferson
1743
Primul rnd al tabelului atribuie nume pentru fiecare coloana.
Fiecare rnd al tabelului, altul dect primul rnd, descrie o singura personalitate. De exemplu, al
doilea rnd descrie o personalitati pe nume George Washington.
Fiecare coloana, descrie un anumit atribut al personalitatii De exemplu, a doua coloana contine
numele personalitatilor, iar a treia coloana contine anii n care s-au nascut acestia.
Pentru a se putea face referire, mai usor, la un anumit rnd al tabelului, se obisnuieste ca fiecare
tabel sa contina o coloana care identifica n mod unic fiecare rnd. Aceasta coloana se numeste
"cheia primara" a tabelului. In exemplul prezentat, coloana numita "PersoanaID" serveste drept
cheie primara.
Daca nici o coloana nu contine o valoare unica pentru fiecare rnd, se pot combina valorile mai
multor coloane pentru a crea o "cheie primara compusa".
O baza de date relationala se numeste astfel datorita capacitatii sale de a stabili relatii ntre date
PersoanaID
001
George Washington
1732
Arhitect
003
002
John Adams
1735
General
001
003
Thomas Jefferson
1743
Filozof
002
Al doilea tabel contine informatii despre meseriile caracteristice ale persoanelor prezentate in
exemplul anterior. Mai precis, tabelul identifica persoana cu o anumita meserie. Numele meseriei
serveste drept cheie primara a tabelului, care mai contine, n afara de aceasta, o singura coloana.
Coloana respectiva stocheaza atributul "PersoanaID" din primul tabel, al persoanei care cunoaste
meseria descrisa de un anumit rnd. De exemplu, angajatul cu numarul 003 este arhitect.
Retineti ca "PersoanaID" este att cheia primara a tabelului original, dar si o coloana din noul
tabel. Coloana "PersoanaID" a noului tabel se numeste "cheie externa"; desi nu este cheia
primara a noului tabel, este cheia primara a unui alt tabel.
Aplicatia software care gazduieste o baza de date se numeste "sistem de gestiune a bazelor de
date" (SGBD). Exista multe sisteme de gestiune a bazelor de date, printre cele mai populare
asemenea sisteme se numara: DB2 , Interbase , MySQL , Oracle , Postgresql , SQL Server ,
Sybase .
MySQL este cel mai popular sistem de gestiune a bazelor de date destinat utilizarii cu PHP, n
mare masura deoarece este gratuit. Totusi, prin intermediul PHP este posibil accesul la aproape
orice SGBD modern.
Bazele de date relationale nteleg SQL (Structured Query Language), un limbaj relativ simplu,
folosit pentru solicitarea datelor. In ciuda simplitatii sale, SQL este un limbaj foarte puternic,
care poate obtine accesul la date stocate n mai multe tabele, poate filtra datele dorite si poate
sorta, rezuma si afisa rezultatele.
n general, bazele de date relationale si stocheaza datele ntr-un singur fisier sau catalog. Aceasta
caracteristica de organizare faciliteaza administrarea datelor, deoarece executarea copiei de
siguranta, respectiv restaurarea unui singur fisier sau catalog se realizeaza mai usor.
Sistemele de gestiune a bazelor de date relationale necesita mai multe cicluri de procesor pentru
a satisface o cerere de date dect cele necesare pentru accesul la un fisier normal, dar ofera
protectie sporita a datelor, iar pentru accesul la distanta usureaza traficul deoarece majoritatea
operatiilor sunt efectuate de programul SQL, astfel singurele date transmise in retea ar fi
rezultatul cerut.
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
BLOB
CHAR(m)
DATE
Descriere
- Date binare arbitrare, cu o lungime maxima de 65535 octeti
- Un sir de caractere de lungime fixa, cu un maxim de m caractere, unde
m este mai mic dect 256. Pentru obtinerea lungimii dorite, se insereaza
spatii finale
- O data n format an-luna-zi; de exemplu 2008-10-15
DECIMAL
DECIMAL(m,d)
- Un numar zecimal, reprezentat sub forma de sir cu "m" cifre, din care
"d" se afla la dreapta punctului zecimal. Daca "m" si "d" sunt omise, n
mod prestabilit se vor utiliza valorile 10 si 0
DOUBLE
DOUBLE (m, d)
FLOAT(m,d)
- Similar cu DECIMAL
REAL
REAL(m, d)
- Similar cu DOUBLE
VARCHAR(m)
- Alegeti BLOB ca tip pentru datele pe care nu trebuie sa le manipulati si la care nu veti
obtine acces prin intermediul limbajului SQL.
- Alegeti un tip data sau ora adecvat pentru coloanele care contin date calendaristice sau
ore.
- Alegeti un tip numeric pentru coloanele folosite pentru numere sau n calcule.
o - Pentru cantitati foarte mari sau foarte mici, alegeti DOUBLE ca tip de date.
o - Pentru coloane care contin numere fara parte zecimala de dimensiuni medii,
alegeti SMALLINT sau INTEGER ca tip de date.
o - Pentru alte coloane care contin date numerice, alegeti DECIMAL ca tip de date.
- Alegeti CHAR sau VARCHAR ca tip pentru celelalte coloane, chiar si pentru cele care
contin cifre, cum ar fi un cod postal.
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:
Unde "tabel" este numele tabelului, "coloana" este numele unei coloane, "tip" este tipul datelor
incluse n coloana, se poate specifica un numar nedefinit de coloane.
De exemplu, comanda urmatoare creeaza un tabel numit "carte", care contine coloanele
"carteid", "titlu" si "pret":
CREATE TABLE carte (carteid CHAR(10), titlu VARCHAR(255), pret decimal(5,2));
- n afara tipului de date, intre paranteze, puteti specifica si alte atribute optionale ale unei
coloane:
NOT NULL - Fiecare rnd trebuie sa contina o valoare a coloanei asociate; valorile nule
nu sunt permise.
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);
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:
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:
Unde "tabel" este numele tabelului, "utilizator" este numele contului de utilizator, iar "parola"
este parola pe care o va furniza utilizatorul pentru a-si proba identitatea.
Alternativ, administratorul de sistem poate autoriza un utilizator sa obtina acces la orice tabel
dintr-o baza de date specificata, folosind urmatoarea forma a comenzii "GRANT":
De exemplu, pentru a revoca toate privilegiile (din toate bazele de date) utilizatorului "tip_rau",
scrieti comanda:
REVOKE ALL ON *.* FROM tip_rau;
Comanda "GRANT" are si o forma mai complexa pentru a autoriza accesul numai la anumite
coloane specificate. Forma avansata a acestei comenzi este:
- Unde "privilegiu" este privilegiul care urmeaza a fi extins, "coloane" sunt coloanele carora li se
aplica privilegiul, iar "tabel", "baza_de_date", "utilizator" si "parola" au semnificatiile cunoscute.
Sunt permise si forme similare ale comenzii REVOKE:
SELECT - care permite accesul de citire la rndurile care contin coloana specificata
De exemplu, pentru a permite unui utilizator sa obtina accesul la o coloana, fara a o modifica,
puteti folosi o secventa de comenzi similara cu urmatoarea:
REVOKE ALL ON carte FROM Marius;
GRANT
SELECT(carteid, titlu, pret),
INSERT(carteid, titlu, pret),
UPDATE(carteid, titlu, pret)
ON carte TO php IDENTIFIED BY 'mypassword';
REVOKE INSERT(pret) ON carte FROM Marius;
REVOKE UPDATE(pret) ON carte FROM Marius;
- Prima comanda revoca toate privilegiile de la nivelul tabelului; n caz contrar, aceste privilegii
le vor elimina pe cele situate la nivel de coloana.
Pentru a vedea privilegiile acordate unui anumit utilizator, folositi urmatoarea comanda:
Caracteristica privilegiilor furnizata de MySQL este mai sofisticata si furnizeaza mult mai multe
optiuni. Pentru mai multe informatii, consultati manualul SQL de la adresa www.mysql.com
- Unde "tabel" este numele tabelului, iar "coloana1" si "coloana2" sunt coloanele la care se va
obtine accesul si al caror continut va fi afisat.
Puteti specifica mai multe coloane, separate prin virgula.
Daca vreti sa fie selectate numai acele rnduri care satisfac un anumit criteriu, clauza "WHERE"
va permite sa specificati o conditie; rndurile care nu satisfac conditia nu sunt raportate.
De exemplu, iata o interogare care raporteaza un singur rnd:
SELECT titlu, pret FROM carte WHERE carteid=1;
Forma conditiilor folosite n sub-limbajul DML al limbajului SQL este similara cu aceea a
conditiilor PHP. Puteti folosi oricare din urmatorii operatori relationali:
<>
Inegalitate
!=
Inegalitate, diferit de
<
>
<=
=>
Egalitate
Puteti compara valoarea unei coloane cu aceea a altei coloane, respectiv valoarea unei coloane cu
o valoare string. Valorile string SQL (sirurile) trebuie sa fie incluse ntre ghilimele simple, nu
ntre ghilimelele duble.
Cnd unei coloane nu i-a fost repartizata nici o valoare, SQL i atribuie valoarea speciala NULL.
De asemenea, programatorii pot atribui n mod explicit valoarea NULL unei coloane.
Comparatiile obisnuite cu valori NULL, care folosesc operatorii de (in)egalitate, vor returna un
rezultat fals. Totusi, puteti folosi operatorul special "<=>". care compara valorile tinnd cont de
valoarea NULL. Daca folositi acest operator pentru a compara doua valori NULL, se obtine un
rezultat adevarat.
SQL include si numerosi operatori de comparatie non-algebrici:
Operator
Descriere
x BETWEEN y AND z Adevarat, daca valoarea lui x este cuprinsa ntre valorile lui y si z
x LIKE y
x NOT LIKE y
x IN (y1, y2)
x NOT IN (y1, y2)
x IS 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:
De exemplu, urmatoarea interogare raporteaza rndurile care au pretul de carte mai mare dect
11 sau al caror titlu include sub-sirul 'Curs':
SELECT titlu, pret FROM carte
WHERE pret>11 OR titlu LIKE %Curs%;
Pentru a compara o valoare cu o expresie regulata n MySQL, folositi urmatoarea forma:
x REGEXP y, unde "x" este valoarea care va fi testata, iar "y" este o expresie regulata,
delimitata prin ghilimele simple.
Unde coloana denumita "coloana1" primeste valoarea "valoare1", iar coloana denumita
"coloana2" primeste valoarea "valoare2".
Pot fi specificate mai mult sau mai putin de doua coloane si valori. Numarul coloanelor
specificate trebuie sa fie egal cu numarul valorilor specificate.
Coloanele care nu sunt denumite n comanda "INSERT" si care nu au o valoare prestabilita
(DEFAULT) primesc valoarea NULL, cu exceptia situatiilor cnd valoarea respectiva nu este
permisa (n acest caz, comanda INSERT esueaza).
Daca doriti sa adaugati mai multe randuri intr-un tabel, intr-o singura inserare, puteti folosi
urmatoarea forma a comenzii INSERT:
Pentru a modifica valoarea unui rnd sau mai multor rnduri existente ntr-un tabel, folositi o
comanda "UPDATE", care are urmatoarea forma:
- Unde "tabel" este numele tabelului ale carui rnduri urmeaza sa fie modificate, "coloana1" este
numele primei coloane care urmeaza a fi modificata, "valoare1" este valoarea care va fi
repartizata n "coloana1", "coloana2" este numele celei de-a doua coloane care urmeaza a fi
modificata, "valoare2" este valoarea care va fi repartizata n "coloana2", iar "conditie" identifica
rndul sau rndurile care urmeaza a fi actualizate, dupa o anumita conditie.
Poate fi actualizat un numar mai mare sau mai mic de coloane. Daca se doreste ca toate
randurile coloanei sa fie actualizate, clauza "WHERE" poate fi omisa.
De exemplu, comanda urmatoare modifica din coloana "titlu" numele asociat cartii in "Curs2", in
randul unde coloana "pret" are valoarea 5.
UPDATE carte SET titlu=Curs2
WHERE pret=5;
Pentru a sterge un rnd dintr-un tabel, folositi comanda "DELETE", care are urmatoarea forma:
Daca se vrea a fi sterse toate rndurile tabelului, clauza WHERE poate fi omisa.
De exemplu, comanda urmatoare sterge rndul din tabelul "carte" asociat titlului "Curs2":
DELETE FROM carte WHERE titlu='Curs2';
4. Sortarea si gruparea
Deseori, este important ca datele sa fie raportate ntr-o anumita secventa. Puteti specifica ordinea
de raportare a rezultatelor interogarii folosind clauza "ORDER BY", care are urmatoarea forma:
ORDER BY valoare
Daca se vor folosi mai multe cmpuri de sortare, acestea vor fi separate prin virgula.
Daca doriti sa indicati o sortare descendenta, n locul uneia ascendente, specificati "DESC" dupa
valoare.
De exemplu, pentru a ordona toate cartile n functie de pret, de la cel mai mare la cel mai mic,
respectiv dupa titlu pentru un pret egal, puteti folosi urmatoarea interogare:
SELECT pret, titlu FROM carte
ORDER BY pret DESC, titlu;
Pentru a include numai titlurile care au un pret mai mare de 50, adaugati o clauza WHERE la
comanda SELECT:
SELECT pret, titlu FROM carte
WHERE pret>50
ORDER BY pret DESC, titlu;
SQL include functii care va permit sa raportati valori diferite, valori utile, precum un numar al
rndurilor tabelului. Iata cele mai importante functii in acest sens:
Functie
Descriere
count(*)
count(coloana)
count(distinct coloana)
avg(coloana)
min(coloana)
max(coloana)
sum(coloana)
- Suma valorilor din coloana specificata
De exemplu, interogarea urmatoare raporteaza numarul cartilor si pretul mediu al acestora:
SELECT count(*), avg(pret) FROM carte;
- Datele de iesire vor fi afisate pe o singura linie.
Clauza SQL "AS" specifica un nume nou pentru o coloana sau expresie. Numele specificat este
folosit ca titlu n rapoartele SQL. Clauza "AS" este utila n lucrul cu functiile din tabelul anterior,
va ajuta sa identificati mai usor datele de iesire.
De exemplu, interogarea precedenta poate fi rescrisa pentru a include o clauza "AS", astfel:
SELECT count(*) AS Carte_Numar,
avg(pret) AS Pret_Mediu
FROM carte;
O alta clauza utila este "GROUP BY", aceasta are urmatoarea forma:
GROUP BY coloana-sortare
- Unde "coloana-sortare" este numele sau valoarea unei coloane, specificata ntr-o clauza
"ORDER BY", care trebuie sa urmeze dupa clauza "GROUP BY".
De exemplu, avem un tabel "carte" cu 4 coloane (carteid, titlu, anul si pret), interogarea
urmatoare raporteaza numarul cartilor si pretul mediu pentru fiecare an (anul) n parte:
SELECT count(*), avg(pret) FROM carte
GROUP BY anul
ORDER BY anul;
Pentru a include n datele de iesire numai grupurile selectate, specificati clauza "HAVING"
imediat dupa clauza "GROUP BY". Clauza "HAVING" are urmatoarea forma:
HAVING conditie
De exemplu, pentru a include numai cartile al caror atribut "anul" are valoare mai mare dect
1980, srieti urmatoarea interogare:
SELECT count(*), avg(pret) FROM carte
GROUP BY anul
HAVING anul>1980
ORDER BY anul;
Mai jos sunt afisati operatorii matematici folositi in SQL:
+
*
/
|
&
>>
<<
_
Adunare
Scadere
Inmultire
Impartire
SAU, la nivel de bit
SI la nivel de bit
Deplasare la dreapta
Deplasare la stanga
Complement la nivel de bit
1. Expresii si functii
SQL va permite sa formati expresii folosind valori din coloane, valori literale si functii. Ca si n
PHP, puteti controla ordinea de evaluare a expresiilor SQL folosind paranteze pentru a delimita
sub-expresiile care trebuie evaluate mai intai.
Tabelele urmatoare rezuma functiile MySQL frecvent folosite
Functii matematice frecvent folosite n MySQL
Functie
Descriere
abs(x)
atan(x)
atan2(y,x)
ceiling(x)
cos(x)
exp(x)
floor(x)
log (x)
mod(x,y)
power(x,y) - x la puterea y
rand(x)
sign(x)
- Valoarea -1, 0 sau 1, dupa cum valoarea lui x este negativa, zero
sau pozitiva
sin(x)
sqrt(x)
tan(x)
Functie
Descriere
ascii(s)
char(n)
minuscule
left(s,n)
length(s)
locate(s1, s2)
ltrim(s)
right(s,n)
rpad(s1,n,s2)
rtrim(s)
space(n)
substring(s,m,n)
trim(s)
ucase(s)
Functie
Descriere
minute(t)
month(d)
now()
second(t)
week(d)
year(d)
Functie
database()
Descriere
- Returneaza numele bazei de date deschise
password(s)
version()
2. Uniri
SQL va permite sa obtineti accesul la mai multe tabele ntr-o singura interogare, n general,
aceasta operatie se executa pentru ca datele dintr-un tabel sa poata fi folosite cu date din alt tabel.
De exemplu, sa presupunem ca baza de date este asemanatoare celei prezentate mai jos, unde
avem doua tabele, primul numit "persoane" iar cel de-al oilea numit "meserii", si o relatie cheie
externa - cheie primara (persoanaid) asociaza cele doua tabelele.
persoanaid
nume
AnNastere
meserie
persoanaid
001
George Washington
1732
Arhitect
003
002
John Adams
1735
General
001
003
Thomas Jefferson
1743
Filozof
002
Sa examinam urmatoarea interogare:
SELECT nume, meserie FROM persoane, meserii
WHERE persoane.persoanaid=meserii.persoanaid;
- Constructiile "persoane.persoanaid" si "meserii.persoanaid" se numesc "nume definite", prima
se refera la coloana "persoanaid" din tabelul "persoane", iar a doua se refera la coloana
"persoanaid" a tabelului "meserii".
- Clauza WHERE asigura o echivalenta ntre valoarea cheii externe din tabelul "meserii" cu
aceea a cheii primare din tabelul "persoane", (n absenta clauzei WHERE, se va stabili o
corespondenta ntre fiecare rnd din tabelul cu meserii si fiecare rnd din tabelul cu persoane; un
asemenea rezultat, numit "produs cartezian", contine n general multe rnduri - majoritatea
nedorite - si ca atare trebuie evitat).
- Rezultatul interogarii de mai sus este un raport care indica numele si meseria asociata fiecarui
angajat prezentat n tabelul "meserii".
O interogare ca aceasta, care combina date din mai multe tabele, se numeste "unire". Sunt
posibile si uniri mai complexe, care implica trei sau mai multe tabele.
Daca un rnd dat din tabelul principal (aici "persoane") nu are nici un rnd asociat n tabelul cu
detalii (aici "meserii"), rndul respectiv din tabelul principal nu va aparea n datele de iesire ale
unei uniri. In cazul acesta, pentru a determina aparitia acestei nregistrari din tabelul principal, se
poate folosi o categorie speciala de unire, cunoscuta sub numele de "unire la stnga" sau "unire
exterioara la stnga". Iata un exemplu:
SELECT nume, meserie FROM persoane
LEFT JOIN meserii
ON persoane.persoanaid=meserii.persoanaid;
Aceasta interogare va afisa toate persoanele, indiferent daca acestea au sau nu asociata o meserie.
Persoanele fara o meserie au specificatia NULL n coloana corespunzatoare meseriei.
SOURCE nume_fisier
Unde "nume_fisier" este calea si numele fisierului in care se afla scriptul de shell.
De exemplu, scriem urmatoarele comenzi intr-un fisier numit "lucru.txt" pe care-l salvam in
directorul "C:/teste".
CREATE DATABASE lucrudb;
USE lucrudb;
GRANT ALL ON lucrudb.* TO php IDENTIFIED BY 'mypass';
CREATE TABLE angajat (
angajatnr SMALLINT PRIMARY KEY,
nume VARCHAR(50),
ore SMALLINT,
departament CHAR(16),
salariu DECIMAL(8,2),
data_angajare DATE);
INSERT INTO angajat (
angajatnr,
nume,
ore,
departament,
salariu,
data_angajare)
VALUES (
1,
'George Washinton',
40,
'Contabilitate',
500.00,
'2007-10-04'),
( 2,
'John Adams',
35,
'Marketing',
1000.00,
'2007-10-11'),
( 3,
'Thomas Jefferson washinton',
20,
'Vanzari',
1300.00,
'2007-07-02');
- Pentru a executa acest script, scriem in fereastra de comanda MySQL: SOURCE
C:/teste/lucru.txt
MySQL va executa comenzile din script ca si cum acestea ar fi scrise direct in linia de comanda.
Exemplul de mai sus va crea o baza de date noua, numita "lucrudb", va acorda utilizatorului
"php" toate drepturile in utilizarea acestei baze de date, dupa care va crea tabelul "angajat", cu 6
coloane ("angajatnr", "nume", "ore", "departament", "salariu", "data_angajare") in care vor fi
adaugate trei linii.
Faptul ca limbajul PHP a devenit atat de popular se datoreaza in mare masura faptului ca acesta
contine suport de functii pentru lucrul cu bazele de date.
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
print "Connected to MySQL <br />";
?>
In acest exemplu, serverul MySQL ruleaza pe "localhost" ca si modulul PHP, utilizatorul este
"Marius" iar parola "mypass".
Dupa executia acestui script, daca nu se reuseste conectarea la MySQL, va aparea mesajul
"Unable to connect to MySQL", in caz de reusita, apare mesajul "Connected to MySQL"
n mod prestabilit, functia mysql_connect() se conecteaza la serviciul MySQL prin intermediul
portului 3306, portul MySQL standard. Daca doriti sa obtineti accesul la un server MySQL care
ruleaza pe un port non-standard, puteti atasa un caracter doua puncte si numarul portului dorit la
argumentul care contine numele gazdei; de exemplu, "localhost:3308".
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
print "Connected to MySQL<br />";
mysql_select_db("lucrudb");
if (mysql_error()) {
echo "<br />". mysql_errno(). " : ". mysql_error();
}
?>
Daca se reuseste conexiunea la serverul MySQL si baza de date cu numele "lucrudb" este
inexistenta, rezultatul afisat de exemplul de mai sus va fi urmatorul:
Connected to MySQL
1049 : Unknown database 'lucrudb'
script PHP prin intermediul functiei mysql_query(). Iata un exemplu prin care creem baza de
date "lucrudb":
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$createdb = mysql_query("CREATE DATABASE lucrudb");
if ($createdb)
echo "Baza de date lucrudb a fost creata <br />";
else
echo "<br />". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
- Dupa executarea acestui script, daca totul este corect, va fi creata baza de date "lucrudb" si va fi
afisat mesajul "Baza de date lucrudb a fost creata".
Dupa ce programul a obtinut o conexiune cu serverul MySQL, inainte de a lucra cu tabelele
dintr-o baza de date MySQL, programul trebuie sa selecteze baza de date respectiva. Pentru
aceasta, folositi functia mysql_select_db(), care are urmatoarea forma:
mysql_select_db(baza_de_date)
Unde "baza_de_date" este numele bazei de date la care urmeaza a se obtine acces.
Functia returneaza TRUE daca poate obtine accesul la baza de date, respectiv FALSE n caz
contrar.
Iata un exemplu de selectare a bazei de date "lucrudb":
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if ($selectdb)
echo "Baza de date lucrudb a fost selectata <br />";
else
echo "<br />". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
5. Crearea tabelelor
Dupa conectare si selectarea bazei de date putem crea tabele in cadrul bazei de date selectate.
Pentru aceasta folosim limbajul SQL CREATE TABLE numeTabel (coloana1, coloana2, ...);
impreuna cu functia mysql_query().
In exemplul urmator cream tabelul cu numele "carti" care contine urmatoarele campuri:
Nume camp
id
Tip
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.
<?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
$sql = "INSERT INTO `nume_tabel` (coloana1, coloana2, coloana3)
VALUES
('date1', 'date2', 'date3'),
('valoare1', 'valoare2', 'valoare3'),
('text1', 'text2', 'text3')";
if (mysql_query($sql))
echo 'Datele au fost adaugate';
else
echo "Datele nu au fost adaugate deoarece : ". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
Observati sintaxa de scriere corecta a interogarilor MySQL in PHP, numele tabelului se scrie
intre caracterele ( ` ` ) si valorile intre ghilimele simple ( ' ' )
Dupa ce au fost adaugate mai multe date (randuri) intr-un tabel MySQL, se poate selecta anumite
randuri si coloane cautand dupa un anumit termen sau cuvant. Pentru aceasta se foloseste
comanda WHERE.
- 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'";
'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.
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" />
Un script PHP poate fi foarte simplu sau foarte complex. Totusi, scrierea chiar si a unui script
PHP complex este relativ simpla, necesitand doar un editor de texte obisnuit. In aceasta lectie
veti invata modul de creare si de executare a programelor PHP, veti invata sa creati scripturi PHP
simple, care afiseaza in navigatorul web un text simplu. De asemenea, veti invata sa va
documentati scripturile, astfel incat dumneavoastra si alte persoane sa puteti intelege rapid
scopul si structura acestora.
Mai intai trebuie sa instalati un server web (Apache) si modulul pt. limbajul PHP, acestea sunt
gratuite, le puteti gasi pe net si instala pe fiecare, dar pentru incepatori e recomandat un program
care le are deja configurate (si cu MySQL), precum WampServer, sau sa incarcati scriptul pe un
server web unde este instalat PHP.
Daca nu aveti deja instalat PHP, descarcati de aici -> WampServer, dezarhivati si instalati
programul. (cand este pornit, veti observa o iconita specifica in colltul cu ceasul).
Fisierele .php in care veti scrie scripturile trebuie sa le salvati in directorul www din "wamp",
apoi, ca sa le testati scrieti in browser adresa http://localhost/fisier.php
<?php
?>
- Acesta este un cod de inceput si nu afiseaza nimic.
Apoi, salvati scriptul dumneavoastra sub forma de fisier text, in directorul "www" din "wamp",
cu un nume care respecta urmatoarele reguli:
Este recomandat ca numele fisierului sa fie alcatuit numai din caractere minuscule, cifre
si liniute. Utilizarea de spatii, majuscule si alte caractere ar putea crea probleme pe
sisteme de operare diferite.
Executa prelucrari ale datelor, respectiv obtine accesul la datele stocate in fisiere si baze
de date si le manipuleaza.
Primele doua operatii sunt oarecum mai dificil de realizat decat cea de-a treia. Totusi, afisarea
datelor astfel incat acestea sa fie vizibile utilizatorului este o operatie foarte simpla. Asa cum
paragrafele unui text scris sunt compuse din propozitii, programele PHP sunt alcatuite din
instructiuni. Regulile care controleaza formarea propozitiilor se numesc sintaxa. Acelasi termen
este folosit si pentru a desemna regulile care guverneaza formarea instructiunilor PHP.
Iata un exemplu pentru crearea instructiunii PHP care trimite date de iesire la un browser Web,
astfel incat acestea sa fie vizibile pentru un utilizator:
<?php
echo "scrieti aici un text oarecare";
?>
nvatati sa folositi ghilimele si caractere escape pentru a specifica valori de tip sir
speciale
operatorul uman. Datele trebuie stocate sub forma de siruri daca formatul acestora nu este
numeric sau daca doriti ca operatorul uman sa fie capabil de a introduce sau de a vizualiza datele.
Practic, puteti asimila numerele cu un mod de stocare a datelor n interiorul calculatorului.
Sirurile se pot asimila unui mod de stocare a datelor n afara calculatorului.
Aceste doua mari categorii de date: numere si siruri, formeaza opt tipuri principale de variabile :
- Boolean
- Integer
- Float
- String
- Array
- Object
- Resource
- Null
In mod normal tipul variabilelor nu este specificat explicit; acesta va fi evaluat de catre
interpretorul PHP la momentul run-time (in momentul executarii scriptului).
1. Tipul boolean
Variabilelele de tipul boolean pot lua doar doua valori : FALSE sau TRUE
Variabilele de alt tip decat boolean pot fi convertite la tipul boolean prin operatorul cast (bool)
sau (boolean), plasate inaintea valorilor, desi in general nu e nevoie de aceasta converrire,
valoarea fiind automat recunoscuta de PHP.
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 stnga
numarului. Evitati sa scrieti spatii sau virgule ca parte a unui ntreg PHP.
Iata cteva exemple de numere PHP ntregi :
215678 - Numar in reprezentare zecimala
0x1A8; - Numar in reprezentare hexazecimala (reprezinta: 1*16*16 + 10*16 + 8 =
424 (in zecimal))
067
- Reprezinta: 6*8 + 7 = 55 (in zecimal)
Valorile minime, respectiv maxime pe care le poate lua o variabila de tip integer depind de
sistemul de operare pe care ruleaza modulul PHP. De exemplu pentru un sistem Windows
valoarea unui integer se memoreaza pe 32 de biti: 31 bit pentru numar si un bit pentru semn. In
acest caz valorile unui intreg se afla in intervalul :-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 pna la 1,8 x 10 la
puterea 308 sub forma de numere duble si furnizeaza aproximativ 14 cifre dupa punctul zecimal
(sau cifre semnificative) de precizie.
Iata cteva exemple de numere duble (tipul float)
123.4567
1.2e3;
4. Tipul string
Reprezinta o insiruire de caractere, fiecare caracter este memorat pe 1 byte; setul de caractere
este limitat la 256 valori distincte. Dimensiunea sirurilor poate fi oricat de mare in PHP, nu exista
specificatii care sa limiteze numarul maxim de caractere dintr-un sir.
Spre deosebire de ntregi si de numere float, care contin cifre, sirurile pot contine orice caracter.
Ca atare, sirurile sunt utile pentru stocarea datelor care nu pot fi calculate, precum nume, fraze si
adrese.
In PHP, un sir poate fi declarat in mai multe feluri:
1) Un mod simplu de a declara un sir este prin delimitarea cu ghilimele simple (' ')
Daca dorim ca sirul sa contina caracterul ' va trebui sa inseram inaintea lui caracterul escape \.
Daca dorim ca sirul sa contina caracterul \ va trebui sa dublam acest caracter. Acest
comportament este exemplificat in exemplul urmator:
<?php
$var1 = 'Acesta este un sir de test';
echo 'Curs \'PHP\'';
echo '<br />Vrei sa stergi C:\\*.* ?';
echo '<br />Variabila var1=$var1';
echo "<br />Variabila var1=$var1";
?>
In browser va aparea:
Curs 'PHP'
Vrei sa stergi C:\*.* ?
Variabila var1=$var1
Variabila var1=Acesta este un sir de test
Observati diferenta dintre ultimile doua linii!
In penultima linie, unde s-a folosit gilimele simple pentru delimitarea sirului, variabila $var1 nu
este expandata adica nu este afisat valoarea variabilei var1=Acesta este un sir de test ci exact
textul scris (numele ei). Pentru a realiza afisarea valorii variabilei si nu numele acesteia, se
folosesc ghilimelele duble, precum in ultima linie a exemplului de mai sus.
2) O alta metoda pentru a specifica un sir n PHP este prin folosirea ghiimelelor duble (" ").
Daca intr-un sir delimitat prin ghilimele duble vrem ca acesta sa afiseze numele unei variabile,
nu valoarea acesteia, adaugam un caracter backslash (\) inaintea numelui variabiei.
Exemplu; echo "Numele variabilei este \$var";
Acest cod va afisa Numele variabilei este $var, oricare ar fi valoarea variabilei "$var".
Caracterele care alcatuiesc sirul sunt incluse ntre ghilimele duble (" ");
De exemplu, sirul reprezentnd numele fizicianului care a formulat teoria relativitatii este
"Albert Einstein". Asa cum s-a explicat, un sir poate contine date numerice; de exemplu,
"3.14159".
Daca se doreste adaugarea de ghilimele duble intr-un sir delimitat de ghilimele duble, se adauga
caracterul \ in fata acestora.
Exemplu; echo "Numele programului este \"PHP\".";
Prin delimitarea cu ghilimele duble PHP faciliteaza includerea n siruri a unor caractere speciale,
precum caracterele de salt la linie noua sau retur de car, prin furnizarea de secvente escape care
reprezinta caractere speciale.
Iata secventele escape folosite n PHP:
\\ - 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 ntrun sir, trebuie sa folositi doua caractere backslash.
Pe langa imbricarea variabilelor in cadrul sirurilor delimitate prin ghilimele duble, PHP pune la
dispozitie operatorul de concatenare a sirurilor: . (punct) . Acest operator adauga un sir la
sfarsitul altui sir. De exemplu:
<?php
$nume = 'Popescu';
$prenume='Costel';
echo 'Numele de familie este '.$nume. 'iar prenumele este '.$prenume;
?>
In browser va aparea:
Numele de familie este Popescu iar prenumele este Costel
In anumite situatii este necesar sa accesam unul dintre caracterele unui sir. Pentru aceasta putem
folosi parantezele{} ca in exemplul de mai jos:
<?php
$var1 = 'Acesta este un sir de test';
echo $var1{0}; // Afisaza A (primul caracter din sir)
echo $var1{2}; // Afisaza e (al treilea caracter din sir)
?>
Rezultatul afisat va fi
Ae
3) Sintaxa heredoc este o alta modalitate de a delimita siruri
In acest caz delimitatorul este ("<<<"); acesta trebuie urmat de un identificator unic, dupa care
urmeaza sirul de caractere, iar secventa se incheie din nou cu identificatorul mentionat.
Identificatorul de incheiere trebuie sa se afle in prima coloana a liniei, acesta poate contine
caractere alfanumerice dar neaparat trebuie sa inceapa cu o litera, nu cu o cifra sau alt semn.
Veti intelege mai bine studiind exemplu de mai jos:
<?php
$var1 = <<< EOT
Exemplu de sir care foloseste delimitatorul heredoc.
EOT;
echo $var1;
?>
Rezultatul afisat va fi:
Exemplu de sir care foloseste delimitatorul heredoc.
5. Tipul array
Reprezinta un vector de valori (care creaza o matrice, vezi Lectia 9 despre matrice), fiecare
element al matricei are asociat o cheie. Aceasta cheie va fi folosita ulterior la identificarea unui
element specific at matricei. In PHP tipul array se mai numeste si tip map ordonat, deoarece
elemente vectorului sunt ordonate dupa campul cheie.
Variabilele de tip array si lucrul cu acestea vor fi prezentate mai detaliat in lectiile urmatoare.
Iata un exemplu simplu de variabile array:
<?php
$fructe[0] = 'mere';
$fructe[1] = 'caise';
$fructe[2] = 'piersici';
?>
6. Tipul object
Reprezinta de fapt instanta unei clase declarate in PHP. O clasa este o structura care contine
variabile membru si functii membru.
Variabilele de tip object si lucrul cu acestea vor fi prezentate detaliat in lectiile urmatoare.
7. Tipul resource
Este un tip special de variabila care pastreaza o legatura spre resurse externe. Exemple de resurse
externe: manipulatori pentru deschidere de fisiere, conectare la baze de date, compresia
fisierelor, resurse COM, etc...
8. Tipul NULL
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
$var
$Numar
$_elemente
Pentru a asocia o valoare unei variabile, veti scrie ceea ce se numeste o instructiune de atribuire.
Iata un exemplu simplu:
$temperatura = 33.5;
Numele variabilei este urmat de un semn egal (=), care identifica instructiunea ca fiind o
instructiune de atribuire. Semnul egal este urmat de valoarea care urmeaza a fi atribuita
variabilei, n acest exemplu, valoarea este data de valoarea literala dubla (float) 33.5. Caracterul
$_POST variabile furnizate scriptului prin metoda HTTP POST (in general prin
formulare)
2. Operatori
Pentru a va ajuta sa efectuati calcule si prelucrari ale datelor, PHP include o diversitate de
operatori si functii utile. Cnd combinati valorile literale si variabilele cu operatori si functii,
construiti ceea ce este cunoscut sub numele de expresii.
Operatorii sunt simboluri specifice care realizeaza o actiune specifica in cadrul unei expresii.
Operatorii actioneaza asupra variabilelor prezente in expresie. De exemplu in cadrul expresiilor
matematice vom folosi operatori aritmetici.
$a + $b
Adunare : a+b
$a - $b
Scadere : a-b
$a * $b
Inmultire: a*b
$a / $b
Impartire: a/b
$a%$a
$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
3. Functii
n afara de operatori, PHP include functii care executa operatii utile. Iata unele exemple de
functii:
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
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:
Fiecare element, camp dintr-un formular trebuie sa aibe un nume distinct, dat prin atributul
"name"; acest nume este folosit de scriptul PHP la care sunt trimise datele, astfel, scriptul PHP
recunoaste datele din campul respectiv folosind numele acestuia.
http://www.marplo.net/script.php?nume=Popescu
http://www.marplo.net/script.php
Metoda GET permite transmiterea unui volum limitat de informatii catre server; de asemenea nu
este recomandata folosirea acestei metode in cazul in care dorim sa transmitem date personale(de
exemplu parolele introduse intr-un formular pot fi vizualizate de oricine in browserul de Web).
- unde "nume este valoarea atributului name al elementului din formularul HTML.
Sa luam un exemplu practic de formular HTML care trimite date (prin method="post") la un
script PHP unde acestea vor putea fi vizualizate.
Salvam scriptul de mai jos intr-un fisier pe care-l numim "test-form.php"
<?php
$nume = $_POST['nume'];
$email = $_POST['email'];
$parola = $_POST['parola'];
echo "Nume = $nume";
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']
http://www.marplo.net/fisier.php?nume1=valoare1&nume2=valoare2
Exemplul include numai doua perechi "nume-valoare"; cu toate acestea, puteti include oricte
asemenea perechi doriti (separate prin caracterul &), in functie de limita impusa de browser.
Pentru a prelua si folosi datele dintr-o astfel de adresa URL, folositi in interiorul scriptului PHP
expresia "$_GET['nume'], ca in exemplu urmator"
$var1 = $_GET['nume1']
$var2 = $_GET['nume2']
Unde "nume1" si "nume2" sunt numele variabilelor din adresa URL, iar "$var1" si "$var2" sunt
variabilele care vor fi folosite in scriptul PHP (din "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
Variabila de mediu
Descriere
CONTENT_LENGTH
CONTENT_TYPE
DOCUMENT_ROOT
GATEWAZ_INTERFACE
HTTP_ACCEPT
HTTP_ACCEPT_CHARSET
HTTP_CONNECTION
HTTP_HOST
HTTP_REFERER
HTTP_USER_AGENT
PATH
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REQUEST_METHOD
REQUEST_URI
SCRIPT_FILENAME
SCRIPT_NAME
SERVER_ADMIN
SERVER_HOST
SERVER_PORT
SERVER_PROTOCOL
SERVER_SIGNATURE
SERVER_SOFTWARE
O caseta de dialog, prin care sunteti ntrebat daca doriti sa descarcati fisierul care contine
scriptul
La vizualizarea rezultatelor unui script PHP se pot produce numeroase erori, chiar daca scriptul
n sine este corect.
- Daca vedeti textul scriptului dumneavoastra sau o caseta de dialog prin care sunteti ntrebat
daca doriti sa descarcati fisierul care contine scriptul, este posibil ca extensia fisierului script sa
fie incorecta sau ca serverul PHP sa nu functioneze. Desi fisierele script PHP trebuie sa aiba, n
general, extensia .php, este posibil (dar mai rar) ca un administrator de sistem sa configureze un
server PHP astfel nct acesta sa impuna o alta extensie de fisier. Astfel, daca scriptul
dumneavoastra esueaza din unul dintre aceste doua motive, luati legatura cu administratorul
dumneavoastra de sistem.
- Daca vedeti un mesaj n care se spune ca scriptul nu exista, este posibil ca dumneavoastra sa fi
tastat incorect adresa URL. Verificati daca ati tastat corect adresa URL identificata de
administratorul dumneavoastra de sistem, precum si daca ati atasat corect la aceasta numele
fisierului care contine scriptul, folosind un slash numai daca adresa URL identificata de
administratorul dumneavoastra de sistem nu se ncheie cu acest caracter.
- Daca vedeti un mesaj n care se arata ca browserul dumneavoastra Web nu are permisiunea de a
obtine accesul la script, poate ca este necesar sa modificati permisiunile fisierului script. Pentru a
afla cum trebuie procedat, consultati-va cu administratorul de sistem.
- Daca vedeti un mesaj n care se spune ca scriptul dumneavoastra contine o eroare, verificati
daca nu a aparut vreuna din urmatoarele probleme:
O eroare de punctuatie, cum ar fi paranteze, ghilimele sau punct si virgula, lipsa sau
inserate gresit
De exemplu, iata un script care contine un tip de eroare frecvent ntlnit. Puteti identifica
eroarea?
<?php
// Acest script contine o eroare de sintaxa
echo "Salut, World Wide Web!;
?>
Din script lipseste caracterul ghilimele duble de nchidere, care trebuie sa delimiteze expresia de
tip text. Daca ncercati sa executati acest script, puteti vedea doar o pagina goala sau o eroare
similara celei prezentate n continuare.
Parse error. Parse error in /home/bmccarty/public_html/php/module-01/syntax-error.php On line
7
Mesajul de eroare ncearca sa va indice sursa erorii, indicnd numarul liniei la care s-a produs
eroarea. Totusi, remarcati ca mesajul va ndruma spre linia 7 a unui script care contine numai 4
linii. Din moment ce ghilimelele duble de nchidere lipsesc, serverul PHP cauta dincolo de
sfrsitul scriptului pentru a gasi ghilimelele duble respective. Ca atare, serverul PHP este
oarecum derutat cu privire la sursa erorii.
Morala este aceea ca nu puteti conta n totalitate pe serverul PHP pentru a determina locatia
erorii; folositi numarul de linie furnizat de server numai ca ndrumar pentru a depista locatia
probabila a erorii.
3. Tratarea erorilor
Modulul PHP poate fi configurat astfel incat sa afiseze erorile intilnite in codul PHP. Acest lucru
poate fi foarte util in cazul depanarii programelor. Pentru a activa afisarea erorilor exista doua
metode:
In cazul primei metode trebuie sa avem drepturi de administrator pentru a modifica fisierul
php.ini. Nu se recomanda setarea parametrului display_errors la valoarea 1(TRUE) in cazul site-
urilor de productie; mesajele de eroare afisate nu sint folositoare utilizatorului. Pe de alta parte
aceasta ar contribui la marirea riscului unui atac.
A doua metoda consta in folositrea functiei ini_set, care permite unui script sa redefineasca
temporar un parametru din fisierul de configurare php.ini.
Consideram un exemplu de cod in care intentionat incercam sa citim variabile care nu exista:
<?php
ini_set('display_errors',1);
echo "Valoarea transmisa este ".$var;
?>
In exemplul de mai sus daca variabila cu nume: "var" nu exista PHP va afisa un mesaj de eroare
de genul:
Notice: Undefined variable: var
Putem determina tipurile de erori pe care le semnaleaza PHP folosind functia:
error_reporting(). Aceasta preia o constanta care specifica nivelul la care se afiseaza erorile.
Exemplu :
<?php
ini_set('display_errors',1);
error_reporting(E_ALL & ~E_NOTICE);
echo "Valoarea transmisa este ".$_GET['orase'];
?>
- Testati acest exemplu pentru a vedea rezultatul.
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:
echo defined("PI");
Valoarea "pi" este folosita extrem de frecvent n unele calcule. Pentru comoditate, PHP
furnizeaza o functionalitate mai indicata dect definirea unei constante cu valoarea pi, functia
pi() returneaza valoarea respectiva, cu 14 cifre semnificative (3.1415926535898).
Astfe, puteti calcula aria unui cerc folosind urmatoarea expresie:
$x = 1;
$y = 2.5;
$z = $x+$y;
echo $z;
$x = 1;
echo $y
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.
$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.
intval()
strval()
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");
"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
// 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)) {
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 )
$var = 'Un sir oarecare';
print_r($var);
// Un sir oarecare
?>
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');
// Transforma si adauga elementele /valorile variabilei $aray intr-un sir specific
$sir_var = serialize($aray);
echo $sir_var;
// a:2:{s:4:"site";s:14:"www.marplo.net";s:3:"php";s:9:"tutoriale";}
echo gettype($var);
// double
// 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" }
$sir = 'Sir test';
var_dump($sir);
?>
// 'Sir test'
$a<1;
Aceasta expresie conditionala foloseste operatorul <, care are, n esenta, aceeasi semnificatie ca
n algebra. Expresia are valoarea TRUE daca si numai daca valoarea variabilei $a este mai mica
dect 1; n toate celelalte cazuri, are valoarea FALSE.
Puteti forma expresii conditionale complexe prin unirea a doua expresii conditionale cu ajutorul
unui operator logic. De exemplu, expresia urmatoare este adevarata daca ambele expresii
conditionale care o compun sunt adevarate:
Cu alte cuvinte, expresia este adevarata daca att variabila $a, ct si variabila $b au valori mai
mici dect 1.
PHP furnizeaza un set de asemenea operatori relationali, prezentati pe scurt n tabelul de mai jos.
Puteti folosi operatorii logici pentru compararea sirurilor; cu toate acestea, un sir care apare ntro expresie conditionala este convertit la o valoare numerica nainte de evaluarea expresiei.
Deseori, se ajunge la rezultate neasteptate, n general, valorile sirurilor trebuie sa fie comparate
folosind o functie de comparare a sirurilor; aceste functii vor fi explicate n lectiile urmatoare.
Operatori logici
Operator
Descriere
$a < $b - TRUE daca valoarea lui $a este mai mica dect valoarea lui $b.
$a > $b - TRUE daca valoarea lui $a este mai mare dect valoarea lui $b.
$a >= $b - TRUE daca valoarea lui $a este mai mare sau egala cu valoarea lui $b
$a <= $b - TRUE daca valoarea lui $a este mai mica sau egala cu valoarea lui $b
$a = $b - TRUE daca valoarea lui $a este egala cu valoarea lui $b.
- TRUE daca $a si $b sunt identice; cu alte cuvinte, daca $a si $b au
$a == $b
acelasi tip si aceeasi valoare
$a != $b - TRUE daca valoarea lui $a este diferita de valoarea lui $b
- TRUE daca $a si $b nu sunt identice; cu alte cuvinte, daca $a si $b nu
$a !== $b
sunt de acelasi tip si aceeasi valoare
$x AND $y - TRUE daca att $x, ct si $y sunt adevarate
$x && $y - TRUE daca att $x, ct si $y sunt adevarate.
$x OR $y - TRUE daca minimum una din expresiile $x sau $y este adevarata.
$x || $y - TRUE daca minimum una din expresiile $x sau $y este adevarata.
$x XOR $y - TRUE daca numai una din expresiile $x sau $y este adevarata.
!$x
- TRUE daca $x este FALSE
NOT $x - TRUE daca $x este FALSE
Retineti ca puteti prefixa o expresie conditionala cu operatorul !, care inverseaza valoarea
"TRUE" sau "FALSE" a operandului sau.
Observati ca PHP foloseste doi operatori logici care executa aceeasi operatie (AND si &&)
respectiv (OR si ||).
Cu toate acestea, operatorii difera din punctul de vedere al precedentei - caracteristica care
determina ordinea n care sunt executate operatiile n timpul evaluarii expresiilor. Operatorii &&
si || au o precedenta relativ ridicata, n timp ce operatorii AND si OR au o precedenta relativ
redusa. Este la fel ca in aritmetica unde, intr-o ecuatie ca aceasta: a + b * c se executa intai
inmultirea si apoi adunarea, chiar daca ordinea lor este alta (daca nu sunt folosite paranteze). La
fel si in PHP, se pot folosi paranteze rotunde pentru a controla ordinea executarii operatiilor.
Pentru comoditate, puteti forma expresii conditionale fara un operator logic. De exemplu, daca
$a este o variabila numerica, puteti folosi expresia $a ca expresie conditionala. Expresia este
considerata ca avnd valoarea FALSE daca valoarea variabilei $a este zero, respectiv valoarea
TRUE daca valoarea variabilei respective este diferita de zero.
Daca folositi un sir ca expresie conditionala, expresia are valoarea FALSE daca sirul este vid sau
daca are valoarea speciala "\0", care simbolizeaza un octet cu valoarea zero.
Similar, utilizarea unei valori nedefinite ca expresie conditionala determina obtinerea valorii
FALSE. Daca folositi un tablou sau un obiect ca expresie conditionala, aceasta are valoarea
FALSE daca tabloul sau obiectul sunt vide (fara vreo valoare); n caz contrar, expresia are
valoarea TRUE.
If(conditie) {
Instructiune(1);
Instructiune(2);
..................
}
- Dupa cum se observa dupa if urmeaza o pereche de paranteze rotunde in interiorul carora se
plaseaza conditia, adica o expresie logica a carei rezultat poate fi TRUE sau FALSE. Daca si
numai daca rezultatul expresiei logice (conditia) este TRUE se vor executa instuctiunile :
Instructiune(1), apoi Instructiune(2), etc...
Se observa ca acest set de instructiune se plaseaza intre acolade. Doar intr-un singur caz aceste
acolade nu sunt necesare si anume: in cazul in care este scrisa doar o singura instructiune.
Daca rezultatul expresiei logice dintre paranteze rotunde este FALSE , setul de instructiuni dintre
acolade nu se va executa, controlul programului va trece mai departe.
Iata inca un exemplu, practic:
<?php
$numar = 12;
if ($numar > 10)
echo "Acesta este un numar mai mare decat 10";
?>
- Atunci cnd este executat scriptul, instructiunea if evalueaza expresia conditionala $numar >
10, care este adevarata (TRUE) numai daca valoarea variabilei $numar este mai mare dect 10.
Daca valoarea variabilei $numar este mai mare decat 10, se va executa instructiunea echo, in
caz contrar programul va trece mai departe.
In general, limbajul PHP ignora spatiile albe. In mod conventional, o instructiune asociata unei
instructiuni "if" este scrisa decalat n raport cu aceasta. Acest procedeu este recomandat deoarece
prin utilizarea sa este facilitata citirea programului.
Sa presupunem ca doriti sa executati o instructiune atunci cnd o conditie este TRUE si o alta
instructiune cnd conditia este FALSE. Instructiunea else va permite sa procedati astfel, dupa
cum urmeaza:
If(conditie) {
Instructiune(1);
Instructiune(2);
..................
}
else {
Instructiune(3);
Instructiune(4);
..................
}
In acest din urma caz daca expresia logica din paranteze: conditie este adevarata se vor executa
instructiunile: Instructiune(1); Instructiune(2); , iar daca valoarea expresiei logice : conditie are
valoarea FALSE se vor executa instructiunile: Instructiune(3); Instructiune(4);
Instructiunea asociata unei instructiuni if sau else poate fi ea nsasi o instructiune if. O asemenea
instructiune if se numeste "instructiune if imbricata".
Iata un exemplu de instructiune if imbricata:
<?php
$numar = 88;
if ($numar > 10)
if ($numar > 100)
echo "Acesta este un numar mai mare decat 100";
else
echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10";
else
echo "Acesta este un numar mic";
?>
Exemplul afiseaza mesajul "Acesta este un numar mai mare decat 100" daca valoarea variabilei
$numar depaseste 100; n caz contrar, daca valoarea variabilei $numar este mai mare dect 10
si mai mica decat 100, se afiseaza mesajul "Acesta este un numar mai mic decat 100, dar mai
mare decat 10". Daca valoarea variabilei $numar este mai mica sau egala cu 10, exemplul
afiseaza mesajul "Acesta este un numar mic".
Instructiunile if imbricate pot deveni extrem de dificil de nteles daca numarul de instructiuni si
nivelul de imbricare nu sunt relativ reduse. Deci trebuie sa le folositi cu economie.
O instructiune corelata att cu instructiunea if, ct si cu instructiunea else, este instructiunea
elseif. Cnd este folosita corect, poate fi mai simplu de nteles dect o instructiune if imbricata,
logic echivalenta cu aceasta.
Iata un exemplu de instrutiune elseif:
<?php
$numar = 88;
if ($numar > 100 )
default:
echo "Acesta nu este un cod valabil";
}
?>
- Actiunea unei instructiuni switch este determinata de valoarea unei expresii ntregi, nu de
valoarea unei expresii conditionale. Numele variabilei este dat ntre parantezele care urmeaza
dupa cuvntul cheie switch. Acoladele delimiteaza o serie de instructiuni case si o instructiune
default optionala, fiecare dintre instructiunile cuprinse ntre acolade putnd avea instructiuni
asociate.
Cnd este executata, instructiunea switch ncearca sa stabileasca o identitate ntre valoarea
variabilei sale si valoarea asociata unei instructiuni case. Se vor executa instructiunile asociate
primei instructiuni "case" pentru care identitatea respectiva este valabila.
Daca valoarea variabilei din instructiunea switch nu corespunde nici uneia din valorile asociate
instructiunilor case, se vor executa instructiunile asociate instructiunii default, daca exista o
asemenea instructiune (ne este obligatorie).
Un procedeu de programare indicat consta n aceea ca fiecare instructiune case din cadrul unei
instructiuni switch sa se ncheie cu o instructiune break.
; Instructiunea break determina ncheierea executiei instructiunii switch, sare peste "case-urile"
ramase si se executa codurile care mai sunt (daca exista) dupa "switch". n absenta instructiunii
"break", executia trece la urmatoarea instructiune "case" sau "default", fapt nedorit n majoritatea
cazurilor.
Nu este necesar sa folositi numere ntregi consecutive n instructiunile case ale unei instructiuni
switch. Daca preferati, puteti folosi numere ntregi non-consecutive, numere cu virgula sau
siruri.
2. Operatorul ? :
Operatorul conditional ?:, denumit uneori "operator ternar" sau "operator ntrebare-doua
puncte", constituie o alta modalitate de a scrie decizii n PHP.
Acest operator formeaza o expresie care se poate folosi n multe contexte PHP. Iata sintaxa de
utilizare a acestuia:
Observati cum semnul ntrebarii este separat de caracterul doua puncte prin valoarea valoareTRUE.
Operatorul conditional si evalueaza expresia conditionala. Daca expresia este evaluata la
valoarea TRUE, operatorul conditional returneaza valoarea valoare-TRUE; n caz contrar,
returneaza valoarea valoare-FALSE.
De exemplu, sa luam n considerare urmatoarea instructiune de atribuire, care foloseste un
operator conditional:
Aceasta instructiune de atribuire compara valorile variabilelor $b si $c. Daca valoarea variabilei
$b este mai mare dect aceea a variabilei $c (adica TRUE), atunci variabilei $a i este atribuita
valoarea 10; n caz contrar, variabilei respective i este atribuita valoarea 20.
expresie1 se executa o singura data si anume la inceputul instructiunii; conditie este o expresie
logica ; instructiunea for se executa atita timp cat valoarea expresiei : conditie are valoarea
TRUE.
De fiecare data dupa executia instructiunilor dintre acolade se executa : expresie2.
Iata un exemplu practic de utilizare a unei instructiuni for:
<?php
$suma = 0;
for ($n=1; $n<=3; $n++) {
$suma += $n;
echo "<br /> Suma intregilor de la 1 la $n este $suma.";
}
?>
Rezultatul afisat va fi:
Suma intregilor de la 1 la 1 este 1
Suma intregilor de la 1 la 2 este 3
Suma intregilor de la 1 la 3 este 6
n exemplu se calculeaza suma ntregilor cuprinsi ntre l si 3. Pentru aceasta, mai nti se
initializeaza variabila $suma la valoarea 0. Apoi se executa o instructiune for care incrementeaza
n mod repetat valoarea variabilei $suma.
Pentru a vedea cum functioneaza mecanismul acestei instructiuni, sa examinam componentele
instructiunilor for.
Instructiunea "for" include trei expresii, care apar ntre paranteze; fiecare expresie este separata
de vecina sa printr-un caracter punct si virgula(;).
Prima expresie este expresia de initializare. Aceasta se executa atunci cnd PHP ajunge la
instructiunea for. In exemplu, expresia de initializare atribuie valoarea variabilei $n,
($n=1) variabila denumita "variabila de ciclare" sau "index".
A doua expresie este expresia de test. Aceasta este o expresie conditionala care indica
daca se executa sau nu corpul instructiunii, n general, face referire la variabila de ciclare.
In cadrul exemplului, expresia de test compara valoarea variabilei $n cu valoarea 3 ($n
<= 3).
Expresia de test este evaluata pentru prima data imediat dupa evaluarea expresiei de
initializare.
Cea de-a treia expresie este expresia pas. n general, aceasta modifica una sau mai multe
variabile la care se face referire n expresia test. n cadrul exemplului, expresia pas
incrementeaza valoarea variabilei $n ($n++).
Dupa care se trece la corpul instructiunii for, aici, instructiunea $suma += $n si echo "Suma
intregilor de la 1 la $n este $suma."; reprezinta corpul instructiunii for.
Dupa executarea corpului functiei se verifica din nou expresia de test (conditie) dintre paranteze,
daca rezultatul este TRUE se trece mai departe la expresia "pas" (a treia din paranteze) si mai
departe la corpul functiei for. Dupa aia din nou la expresia de test dintre paranteze..., pana cand
rezultatul este FALSE (in exemplu nostru, $n>3)
Instructiunea for este utila pentru numarare si executarea n mod repetat a unor actiuni.
Instructiunea while executa un set de instructiuni atita timp cit valoarea expresiei "conditie" este
adevarata:
Forma generala a instructiuni while este urmatoarea :
while(conditie) {
Instructiune(1);
Instructiune(2);
Instructiune(3);
.............
}
Setul de instructiuni Instructiune(1), Instructiune(2), etc... se vor executa atita timp cit valoarea
expresiei logice "conditie" are valoarea TRUE.
Sa studiem un exemplu practic:
<?php
$n = 0;
$suma = 0;
while ($n <= 3) {
$suma = $suma +$n;
$n++;
}
echo "Suma este $suma";
?>
In scriptul de mai sus avem la inceput (in afara lui "while") $n = 0 si $suma = 0, se verifica
conditia din paranteza a functiei while ($n<=3), cum aceasta este TRUE (deoarece la aceasta
etapa $n = 0), se trece la executarea corpului functiei unde : $suma = $suma + $n si $n++ (adica
$n = $n + 1), astfel acum $n va fi egal cu 1, se verifica din nou conditia din paranteze, care este
TRUE ($n fiind acum egal cu 1), se executa iar corpul functiei..., si tot asa se executa aceasta
"bucla" pana cand la verificarea conditiei din paranteze rezultatul este FALSE, in acest moment
se incheie executia functiei while si se trece mai departe la urmatoarea functie (in cazul nostru:
echo "Suma este $suma";, unde dupa executia functiei while $suma a devenit egala cu 6).
In browser va aparea urmatorul rezultat:
Suma este 6
do {
Instructiune(1);
Instructiune(2);
Instructiune(3);
.............
} while(conditie);
Iata exemplul prezentat la functia while, de data aceasta folosind functia do while :
<?php
$n = 0;
$suma = 0;
do {
$suma = $suma +$n;
$n++;
} while ($n <= 3);
echo "Suma este $suma";
?>
1. Utilizarea matricelor
Deseori este convenabila stocarea mai multor valori ntr-o variabila. O asemenea variabila se
numeste matrice (Array sau "tablou"), iar valorile individuale se numesc elementele matricei.
Aici, "matrice", "Array" sau "tablou" reprezinta acelasi lucru (in varianta engleza: Array), fapt
pentru care vom folosi orcare dintre aceste denumiri.
Fiecare element al unei matrici are doua elemente importante: cheia si valoarea elementului.
Matricele pot fi create folosind doua medode principale:
2 - folosind sintaxa array() despre care am vorbit in Lectia 2 despre tipul variabilelor.
$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];
$preferinte[Nelu] = "cirese";
$preferinte[Radu] = "mere";
$preferinte[Gabi] = "pere";
Deoarece valoarea cheilor nu a fost specificata, acestea vor fi automat trecute de program ca
numere intregi consecutive, incepand de la "0" (prima cheie va avea valoarea '0', a doua cheie va
avea valoarea '1', ...)
Aceasta instructiune creeaza o matrice care contine urmatoarele asocieri:
0 => Perl
1 => PHP
2 => Python
Daca doriti sa asociati unei valori o anumita cheie, puteti folosi operatorul =>, astfel:
10 => Perl
11 => PHP
12 => Python
Ca si n cazul utilizarii unei instructiuni de atribuire pentru crearea unei matrice valorile cheilor
nu trebuie sa fie consecutive si nici macar ntregi:
2. Matrici multi-dimensionale
Este posibil ca un element al matricei sa fie de asemenea o matrice. In acest caz avem de-a face
cu o matrice multi-dimensionala.
Sa luam un exemplu practic :
<?php
$multiDimArray[firstLine] = array(1=>10, 2=>20, "a"=>"alpha");
$multiDimArray["nextLine"] = array(1=>20, 2=>40, "b"=>"beta");
echo "<br />".$multiDimArray["firstLine"][1];
echo "<br />".$multiDimArray["nextLine"][1];
echo "<br />".$multiDimArray["firstLine"][2];
echo "<br />".$multiDimArray["firstLine"]["a"];
echo "<br />".$multiDimArray["nextLine"]["b"];
?>
Sau putem scrie acelasi script si astfel (rezultatul e acelasi) :
<?php
$multiDimArray = array("firstLine"=>array(1=>10, 2=>20, "a"=>"alpha"),
"nextLine"=>array(1=>20, 2=>40, "b"=>"beta"));
echo "<br />".$multiDimArray["firstLine"][1];
echo "<br />".$multiDimArray["nextLine"][1];
echo "<br />".$multiDimArray["firstLine"][2];
echo "<br />".$multiDimArray["firstLine"]["a"];
echo "<br />".$multiDimArray["nextLine"]["b"];
?>
Rezultatul afisat va fi urmatorul :
10
20
20
alpha
beta
In exemplul de mai sus am declarat un array cu 2 linii si 3 coloane. Prima linie este identificata
de array-ul cu numele "fisrtLine", iar ce-a de-a doua linie este identificata de "nextLine".
Puteti obtine acces la valoarea asociata cheii 2 prin intermediul unei instructiuni ca aceasta:
$y = 3*$x[2];
Similar, puteti modifica valoarea asociata cheii 3 prin intermediul unei instructiunu ca aceasta:
$x[3] = 101;
4. Parcurgere Array
Uneori, n loc de a obtine accesul la un singur element al unui tablou sau de a-l modifica, doriti
sa obtineti accesul la mai multe elemente ale tabloului. De exemplu, sa presupunem ca doriti sa
determinati daca n tablou exista o anumita cheie sau valoare. Sau sa presupunem ca tabloul
reprezinta preturi si doriti sa micsorati fiecare valoare cu 10 procente. Operatii de acest gen
implica parcurgerea iterativa a tabloului sau, altfel spus, accesul la fiecare element al tabloului.
- Parcurgerea unui Array secvential
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++) {
Instructiunea break
Observati ca parcurgerea continua chiar si dupa gasirea valorii cautate.
Cnd se cauta ntr-un tablou, executia cautarii poate fi oprita dupa gasirea elementului dorit;
continuarea parcurgerii in Array nu face dect sa iroseasca resursele calculatorului, fara a afecta
rezultatele operatiei.
Pentru a opri executia unei parcurgeri, puteti folosi instructiunea break, care determina
ncheierea imediata a buclei care o contine.
Iata cum se poate revizui exemplul anterior, astfel nct sa includa o instructiune break:
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$cauta = PHP; // se cauta in tabloul $limbaje valoarea $cauta
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
echo "<br />Determinarea unei identitati cu $limbaje[$i]";
if ($cauta == $limbaje[$i]) {
echo "<br />$cauta este un limbaj excelent.";
break;
}
}
?>
Acum, dupa stabilirea unei identitati, instructiunea break provoaca sistarea buclei for.
Iata datele de iesire rezultate, care acum omit examinarea inutila a elementului tabloului asociat
cu limbajul "Python":
Determinarea unei identitati cu Perl
Determinarea unei identitati cu PHP
PHP este un limbaj excelent.
Instructiunea continue
O instructiune corelata cu instructiunea break este continue.
Instructiunea continue opreste secventa curenta a buclei, determinnd evaluarea imediata a
expresiilor de incrementare si de test.
Ca un exemplu, sa presupunem ca doriti sa cautati n tabloul $limbaje pentru a determina
numarul limbajelor care au nume scurte, adica nume alcatuite din maximum 4 caractere. Iata un
exemplu care executa aceasta prelucrare a datelor:
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$scurt = 0;
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
$n = strlen($limbaje[$i]);
echo "<br />$limbaje[$i] are $n caractere lungime";
if ($n > 4) continue;
$scurt++;
}
echo "<br />Au fost gasite $scurt limbaje cu nume scurte.";
?>
O instructiune de atribuire stabileste valoarea initiala a variabilei $scurt la zero, folosita pentru a
numara numele scurte gasite.
Instructiunea for se aseamana celor folosite anterior. Corpul acestei instructiuni difera, desigur,
de cele folosite anterior. Valoarea variabilei $n este stabilita ca fiind egala cu numarul
caracterelor care compun numele limbajului, folosind functia strlen(), care calculeaza lungimea
unui sir.
Daca instructiunea if stabileste ca elementul curent al tabloului face referire la un limbaj cu nume
lung, se executa instructiunea continue.
Instructiunea continue determina trecerea parcurgerii la urmatorul element din tablou, fara a mai
executa expresia "$scurt++"; daca nu au mai ramas elemente n tablou, bucla for si ncheie
executia.
La finalizarea parcurgerii, o instructiune echo afiseaza numarul numelor scurte de limbaje gasite
n tablou. Iata rezultatul:
Perl are 4 caractere lungime
PHP are 3 caractere lungime
Python are 6 caractere lungime
Au fost gasite 2 limbaje cu nume scurte.
- O lista cu 37 functii utile in lucrul cu Array gasiti la pagina -> Functii pentru Array
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));
// Va afisa:
?>
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));
// Va afisa:
Array ( [0]=>Array ( [0]=>a [1]=>b ) [1]=>Array ( [0]=>c [1]=>d )
[2]=>Array ( [0]=>e ) )
?>
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);
// Va afisa:
?>
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:
?>
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);
// Va afisa:
?>
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);
// Va afisa:
?>
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("a"=>1, 3);
// 4
13. array_product(array)
- Returneaza produsul elementelor din "array"
<?php
$aray = array(1, 2, 3, 4);
echo array_product($aray);
?>
// 24
tutorial - 8 - php -
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 )
?>
16. array_search("val", array)
- Returneaza cheia din "array" care are valoarea "val", sau FALSE daca nu exista. Cautarea e
"case-sensitive"
<?php
$aray = array(1, 2, 3, 'a', 'b'=>'c');
$re = array_search('c', $aray);
echo $re;
?>
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);
// $aray va avea acum:
echo $re;
?>
array(3, 4);
// 1
<?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:
?>
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);
// $aray va deveni:
?>
23. asort(array)
- Sorteaza un "array" cu valorile ordonate in ordine alfabetica, 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);
// $aray va deveni:
?>
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
?>
27. implode("separator", array);
- Transforma "array" in sir (string), adaugand valorile intr-un sir, separate de ceea ce e specificat
la "separator".
<?php
$aray = array('www', 'marplo', 'net');
$sir = implode('.', $aray);
echo $sir;
?>
// www.marplo.net
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);
// $aray va deveni:
?>
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);
// $aray va deveni:
?>
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);
// $aray va deveni:
?>
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);
// $aray va deveni:
?>
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
?>
Sortarea matricelor
- Instructiunea parcurge n mod iterativ (element cu element) tabloul denumit "tablou", stabilind
valori adecvate pentru valorile variabilelor "$cheie" si "$valoare" aferente fiecarui element al
tabloului.
Iata un exemplu simplu:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
foreach ($limbaje as $index => $limbaj) { // parcurge iterativ tabloul
echo "<br />$index =>$limbaj";
}
?>
- Remarcati ca instructiunea echo face pur si simplu referire la valorile variabilelor $index si
$limbaj, carora li se atribuie n mod automat valorile cheii, respectiv elementului curent.
10 =>Perl
20 =>PHP
21 =>Python
Cateodata este nevoie sa parcurgem datele unui tablou multi-dimensional.
Pentru a parcurge matricea, folositi instructiuni foreach imbricate:
Pentru a invata modul de parcurgere a unui Array multi-dimensional, sa studiem urmatorul
exemplu:
<?php
$date = array("PHP"=>array("simplu", "popular"), "Python"=>array("simplu", "nepopular"),
"Pearl"=>array("dificil", "popular"));
foreach ($date as $limbaj => $valoare) {
foreach($valoare as $cheie =>$caracteristica) {
echo "<br />$limbaj : $caracteristica";
}
}
?>
- Instructiunea foreach exterioara obtine cate un Array asociat cu fiecare limbaj; a doua
instructiune foreach, interioara, parcurge fiecare Array obtinut de prima instructiune foreach.
Iata rezultatul:
PHP : simplu
PHP : popular
Python : simplu
Python : nepopular
Pearl : dificil
Pearl : popular
3. Functia key()
Functia key() este corelata cu functia current(). Daca functia current() returneaza valoarea
asociata elementului curent, functia key() returneaza cheia asociata elementului curent.
Iata un exemplu care ilustreaza modul de operare al acestei functii:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
$curent = current($limbaje);
$cheie = key($limbaje);
echo "<br />functia current() a returnat $curent";
echo "<br />functia key() a returnat $cheie";
?>
Iata datele de iesire ale exemplului:
functia key() a returnat 10
4. Functia each()
O alta functie utila n parcurgerea tablourilor este each().
Functia each() returneaza perechea "cheie-valoare" care se afla la pozitia curenta din tabloul
specificat. Perechea "cheie-valoare" este returnata sub forma unui Array asociativ cu patru
elemente, dupa cum urmeaza:
Cheie
Valoare
5. Functia list()
O alta functie utila n lucrul cu tablouri este functia list(), aceasta va permite sa atribuiti valori la
numeroase variabile n cadrul unei instructiuni.
Functia list() este deseori folosita cu functia each(), deoarece functia list() faciliteaza accesul
separat la cheia si la valoarea returnate de functia each().
Forma generala de utilizare a functiei list() este urmatoarea:
list($var1, $var2, .., $varn) = valoare_tablou;
Fiecare dintre variabilele specificate, de la $var1 la $varn, primeste o valoare din tabloul
"valoare_tablou".
ntr-un fel, functia list() este opusa functiei array(), deoarece functia list() mparte un tablou
ntr-o serie de valori scalare, n timp ce functia array() construieste un tablou dintr-o serie de
valori scalare.
Iata un exemplu care ilustreaza modul de utilizare a functiei list():
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
list($cheie, $valoare) = each($limbaje);
echo "<br />cheie = $cheie, valoare = $valoare";
$urmator = next($limbaje);
echo "<br />urmator = $urmator";
?>
Iata datele de iesire ale exemplului:
cheie = 10, valoare = Perl
urmator = Python
PHP contine peste 40 de functii pentru lucrul cu tablourile. De exemplu, functia array_search()
faciliteaza cautarea ntr-un tablou.
Pentru informatii despre aceasta functie si despre alte functii utilizate n lucrul cu tablouri,
vizitati site-ul www.php.net.
6. Sortarea tablourilor
Sortarea reprezinta o alta operatie frecvent aplicata tablourilor. PHP furnizeaza o suita de functii
care faciliteaza sortarea unui tablou.
De exemplu, un tablou poate fi creat dupa cum urmeaza:
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
Apoi, doriti sa sortati tabloul n ordine alfabetica, in functie de numele limbajului de programare.
0 => PHP
1 => Perl
2 => Python
Observati ca secventa de sortare sau secventa de aranjare (cum este numita uneori) este sensibila
la diferenta ntre majuscule si minuscule. Deoarece litera "H" mare este sortata inaintea literei
"e" mic, PHP apare nainte de Python n datele de iesire sortate.
Iata un exemplu practic de folosire a functiei sort() :
<?php
$arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan');
sort($arr);
foreach($arr as $key=>$nume) {
echo "<br />Cheie=$key Valoare=$nume";
}
?>
Rezultatul afisat este urmatorul :
Cheie=0 Valoare=Avram
Cheie=1 Valoare=Cristian
Cheie=2 Valoare=Dan
Cheie=3 Valoare=Popescu
- Se observa ca instructiunea sort($arr) sorteaza matricea $arr dupa campul valoare (oridine
alfabetica).
- Observam de asemenea ca valorile campului cheie a fost alterata, fara sa conteze valoarea sau
ordinea cheilor.
Daca dorim sa sortam in ordine inversa alfabetic, folosim functia rsort()
Iata acelasi exemplu, da cu functia rsort()
<?php
$arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan');
rsort($arr);
foreach($arr as $key=>$nume) {
echo "<br />Cheie=$key Valoare=$nume";
}
?>
Acum rezultatul afisat este urmatorul :
Cheie=0 Valoare=Popescu
Cheie=1 Valoare=Dan
Cheie=2 Valoare=Cristian
Cheie=3 Valoare=Avram
Functie
sort()
Rezultat
0 => PHP
1 => Perl
2 => Python
20 => PHP
10 => Perl
21 => Python
0 => Python
1 => Perl
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
ksort - Sortarea unui tablou n functie de cheie, in ordine ascendenta
10 => Perl
20 => PHP
21 => Python
21 => Python
20 => PHP
10 => Perl
foreach($limbaje as $key=>$nume) {
echo "<br />$key => $nume";
}
Functia strcmpcase() este o functie din biblioteca PHP care compara doua siruri fara a tine cont
de majuscule sau minuscule. Functia returneaza o valoare negativa daca primul sir este mai mic
dect al doilea, zero daca sirurile sunt identice, respectiv o valoare pozitiva daca primul sir este
mai mare dect al doilea.
Rezultatul va fi :
0 => Perl
1 => PHP
2 => Python
Pentru mai multe informatii despre functia usort() si despre functiile sale conexe, examinati siteul www.php.net
- 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:
- 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
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.
rand()
echo $nr;
Cnd se produce o eroare n timpul executiei unei functii, PHP genereaza mesaje de eroare.
Uneori, asemenea mesaje de eroare sunt nedorite. n acest caz, puteti suprima generarea
mesajelor de eroare prin adaugarea in fata numelui functiei a caracterului @.
De exemplu,, pentru a suprima mesajele de eroare care pot aparea n timpul executiei functiei
"f()", scriem aceasta functie dupa cum urmeaza:
y = @f(x);
Totusi, indicat este sa scrieti scripturi care sa nu genereze erori, ascunderea lor nu rezolva
problema ce cauzeaza eroarea.
O functie utila, recomandata a fi folosita in script-uri este functia isset() si este cel mai des
folosita cu "if()".
isset() preia ca argument de obicei o variabila si arata daca aceasta a fost sau nu setata.
De exemplu: isset($nr)
- Functia returneaza TRUE daca variabila "$nr" are setata o valoare (diferita de NULL), in caz
contrar returneaza FALSE.
Aceasta functie este foarte utila in determinarea caror comenzi sa fie executate in functie daca o
anumita variabila a fost setata sau nu. Previne aparitia unor erori care apar in cazuri de variabile
nule si ajuta si la securitate.
De exemplu, sa presupunem ca avem un cod PHP care vrem sa fie executat numai daca prin
adresa URL o fost transmisa o variabila "id", adica o adresa de forma
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.');
}
require("nume_fisier")
Cnd este ncarcat un script PHP care contine o instructiune require, continutul fisierului
specificat este inserat si executat n script, nlocuind instructiunea require.
De exemplu, sa presupunem ca realizam un site in PHP care este alcatuita din mai multe pagini,
iar fiecare pagina contine in partea de sus acelasi cod HTML. In loc sa scriem de fiecare data,
pentru fiecare pagina, acelasi cod HTML, il scriem o singura data intr-un fisier separat (de
exemplu "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.
function nume_functie(nume_argument) {
Aici se insereaza corpul functiei
}
<?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
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.
1. abs(nr)
- Returneaza valoarea absoluta (cu +) a lui "nr".
<?php
echo abs(-7.8);
echo abs(3);
echo abs(-5);
?>
// 10010
3. bindec('sir_binar')
- Returneaza echivalentul numeric (decimal) al sirului binar din parametrul "sir_binar".
<?php
echo bindec('10010');
echo bindec('1000');
?>
// 18
// 8
4. ceil(nr)
- Returneaza valoarea rotunjita a lui "nr" la urmatorul (mai mare) intreg.
<?php
echo ceil(7.8);
echo ceil(5);
echo ceil(-2.3);
echo ceil(1.2);
?>
// 8
// 5
// -2
// 2
5. cos(radian)
- Returneaza valoarea cosinus a gradelor de cerc specificate la "radian".
<?php
echo cos(30);
echo cos(90);
?>
// 0.15425144988758
// -0.44807361612917
6. decbin(nr)
- Returneaza un sir cu valoarea binara a numarului "nr".
<?php
echo decbin(-5);
echo decbin(88);
?>
// 11111111111111111111111111111011
// 1011000
7. dechex(nr)
- Returneaza un sir cu valoarea hexazecimala a numarului "nr".
<?php
echo decbin(-5);
echo decbin(88);
?>
// fffffffb
// 58
8. decoct(nr)
- Returneaza un sir cu valoarea octala a numarului "nr".
<?php
echo decbin(-5);
echo decbin(88);
?>
// 37777777773
// 130
9. floor(nr)
- Returneaza valoarea rotunjita a lui "nr" la anteriorul (mai mic) intreg.
<?php
echo floor(7.8);
echo floor(5);
echo floor(-2.5);
echo floor(1.2);
?>
// 7
// 5
// -3
// 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);
?>
11. hexdec('hex')
- Returneaza valoarea zecimala a sirului hexazecimal "hex".
<?php
echo hexdec('ee');
echo hexdec('3fe');
?>
12. hypot(c1, c2)
// 238
// 1022
- Returneaza lungimea ipotenozei unui triunghi dreptunghic care are lungimea catetelor "c1" si
"c2".
<?php
echo hypot(3, 4);
?>
// 5
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
// 2
<?php
echo max(9, 3, 8, 78, 55);
?>
// 78
// 3
// 47
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();
echo M_PI;
?>
// 3.1415926535898
// 3.1415926535898
// 64
23. round(nr)
- Returneaza valoarea rotunjita a lui numar la intregul ce mai apropiat.
<?php
echo round(7.8);
echo round(5);
echo round(-2.5);
echo round(1.2);
?>
// 8
// 5
// -3
// 1
24. sin(radian)
- Returneaza valoarea sinus a gradelor de cerc specificate la "radian".
<?php
echo sin(30);
echo sin(90);
?>
// -0.98803162409286
// 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);
echo tan(90);
?>
// -6.4053311966463
// -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";
10.666666666667
?>
Variabile globale
Variabile locale
Variabilele globale sunt create n exteriorul functiei, n timp ce variabilele locale sunt create n
interiorul unei functii.
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
$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.
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 cnd este executata
functia.
4. Utilizarea referintelor
In mod prestabilit, argumentele transferate unei functii PHP sunt transmise prin valoare, ceea ce
nseamna ca valorile argumentelor sunt copiate si functiile utilizeaza copii ale valorilor
argumentelor lor, nu argumentele n sine. Ca o consecinta, o functie PHP nu poate modifica
valorile argumentelor sale.
Totusi, puteti stabili ca o functie sa aiba posibilitatea de a modifica valoarea unui argument,
specificnd ca argumentul sa fie transferat prin referinta.
Cnd un argument este transferat prin referinta, valoarea sa nu este copiata; functia lucreaza cu
valoarea argumentului si are libertatea de a modifica acea valoare.
Pentru a specifica faptul ca un argument urmeaza a fi transferat prin referinta, inaintea
argumentului va fi adaugat un caracter ampersand (&). Puteti atasa acest caracter la argument n
antetul functiei sau n apelul la functie.
Iata un exemplu care prezinta apelul prin valoare si apelul prin referinta:
<?php
function p_valoare($a) {
$a = 1;
}
function p_referinta(&$a) {
$a = 1;
}
$b = 0;
p_valoare($b);
echo "<br /> \$b = $b";
$b = 0;
p_valoare(&$b);
echo "<br /> \$b = $b";
$b = 0;
p_referinta($b);
echo "<br /> \$b = $b";
?>
Dupa rulati acest script, veti obtine urmatoarele date de iesire:
$b = 0
$b = 1
$b = 1
Retineti ca scriptul contine doua functii, si anume "p_valoare()" si "p_referinta()". Fiecare
functie preia un singur argument, denumit $a. Antetul functiei "p_referinta()" specifica faptul ca
argumentul sau este transferat prin referinta; argumentul functiei "p_valoare()" este transferat
prin valoare.
Primul paragraf al programului invoca functia "p_valoare()", transfernd argumentul prin
valoare. n consecinta, functia lucreaza cu o copie a argumentului sau, iar valoarea variabilei $b
nu se modifica.
Cel de-al doilea paragraf al programului invoca de asemenea functia "p_valoare()"; dar, foloseste
un caracter ampersand (&) pentru a determina transferul prin referinta al valorii variabilei $b. n
consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 n 1.
Cel de-a treilea paragraf al programului invoca functia "p_referinta()". Antetul functiei respective
foloseste un caracter ampersand (&) pentru a specifica faptul ca valoarea argumentului sau este
transferata prin referinta, n consecinta, functia modifica valoarea argumentului sau, care se
transforma din 0 n l.
Prin utilizarea referintelor se evita suprasarcina de copiere a valorilor argumentelor si implicit se
obtine o viteza mai mare de executie a programului. Cu toate acestea, programele devin astfel
mai dificil de nteles, iar referintele sau apelurile prin referinta pot cauza erori de program. Cel
mai indicat este sa evitati referintele, acolo unde este posibil, si sa definiti functii care returneaza
valori, si nu functii care modifica valorile propriilor argumente.
In versiunile PHP 5+, transmiterea la functiei a unui parametru prin referinta "Call-time pass-byreference", 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".
n Lectia 2 au fost prezentate sirurile, tipul de date PHP care stocheaza texte, n aceasta lectie
veti nvata mai multe despre utilizarea sirurilor.
Valorile de tip sir sunt secvente de caractere incluse ntre ghilimele duble sau simple
Puteti include un caracter special n cadrul unui sir folosind o secventa escape care
reprezinta caracterul special.
Variabilele pot fi de tip string si li-se poate atribui o valoare de tip sir.
PHP poate converti n mod automat o valoare numerica ntr-un sir, respectiv valoarea
unui sir ntr-un numar.
putere a lui 10. De exemplu, numarul zecimal 123 are valoarea l x 10 la puterea 2 + 2 x 10 la
puterea 1 + 3 x 10 la puterea 0 = 1x100 + 2x10 + 3x1.
Puteti determina valoarea unui numar reprezentat folosind o alta baza prin nlocuirea lui 10 cu
valoarea bazei respective ntr-o expresie ca aceea prezentata anterior. De exemplu, valoarea
hexazecimala 123 este echivalenta cu valoarea zecimala l x 16 la puterea 2 + 2 x 16 la puterea 1
+ 3 x 16 la puterea 0 = l x 156 + 2 x 16 + 3 x l = 291.
Similar, valoarea n octal 123 este echivalenta cu valoarea zecimala 1x8 la puterea 2 + 2x8 la
puterea 1 + 3x8 la puterea 0 = 1x64 + 2x8 + 3xl=83.
Daca vi se pare complicat sa calculam astfel, nu intrati n panica; n continuare veti nvata sa
determinati valoarea n octal sau hexazecimal echivalenta cu orice valoare zecimala, folosind
functii PHP.
$hex = dechex($i);
echo "<br /> $i (octal $octal, hex $hex): caracter - $c";
}
?>
Scriptul va afisa urmatorul rezultat:
33 (octal 41, hex 21): caracter - !
34 (octal 42, hex 22): caracter - "
35 (octal 43, hex 23): caracter - #
36 (octal 44, hex 24): caracter - $
37 (octal 45, hex 25): caracter - %
38 (octal 46, hex 26): caracter - &
39 (octal 47, hex 27): caracter - '
$num = 13;
$tip = 'PHP';
printf($sir, $num, $tip);
?>
- Includerea datelor formatate in sir se face in ordinea adaugarii variabilelor intre parantezele
functiei "sprintf()".
- Va afisa "Aceasta este lectia 13 din cursul PHP".
Sirul de formatare consta dintr-o serie de caractere si directive ordinare. Un caracter ordinar este
orice caracter, n afara caracterului "%". Caracterele ordinare sunt pur si simplu copiate la iesire.
Directivele reprezinta secvente de caractere care ncep cu simbolul "%"; aceste determina modul
n care va fi formatat argumentul corespunzator.
O directiva simpla, cum este cea din exemplul precedent, poate consta dintr-un caracter "%"
urmat de un specificator de tip, precum "d", care arata ca argumentul trebuie tratat ca numar
zecimal. Cu toate acestea, o directiva mai sofisticata poate include urmatoarele componente, care
trebuie sa apara n ordinea indicata:
Descriere
Valoare
Format
Rezultat
100
%d
100
100
%b
1100100
100
%o
144
100
%x
64
100
%f
100.000000
12.345
%^-10f
12.345000^^^^^^^^
12.345
%^10f
^^^^^^^^12 .345000
12.345
%^-10.2f
12.35^^^^^^^^
12.345
%10.2f
^^^^^^^^12.35
test
%^-10s
test^^^^^^
test
%^10s
*^^^^^^test
Daca utilizarea functiilor printf() si sprintf() pentru formatarea numerelor pare cam greoaie,
puteti folosi functia number_format(), care returneaza o valoare de tip sir continnd un rezultat
formatat. Puteti apela functia cu unul, doua sau patru argumente:
number_format(numar)
number_format(numar, zecimale)
1. Manipularea sirurilor
PHP contine peste 70 de functii care lucreaza cu siruri. Aceasta sectiune descrie cateva functii pe
care este posibil sa le utilizati frecvent. Aceste functii va permit sa obtineti lungimea unui sir, sa
eliminati dintr-un sir caracterele de tip spatiu alb, sa convertiti caracterele unui sir n majuscule
sau minuscule si altele.
- Functia strlen() returneaza lungimea sirului specificat ca argument al functiei.
Iata un exemplu simplu de utilizare a functiei strlen():
<?php
$s = "Acesta este un sir";
$n = strlen($s);
echo "<br /> Lungimea sirului este: $n";
?>
Scriptul de mai sus va afisa:
Lungimea sirului este: 18
- Numeroase functii PHP va permit sa eliminati caracterele de tip spatiu alb de la una sau ambele
extremitati ale unui sir.
Iata un exemplu; care prezinta modul de operare al acestor functii:
<?php
$s = "
Acesta este un sir
";
$n = strlen($s);
echo "<br /> Lungimea sirului este: $n";
$trim =chop($s);
// Elimina spatiile albe din partea dreapta a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
$trim = ltrim($s);
// Elimina spatiile albe din partea stanga a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
$trim = rtrim($s);
// Elimina spatiile albe din partea dreapta a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
$trim = trim($s);
// Elimina spatiile albe din ambele parti a sirului
$n = strlen($trim);
echo "<br /> Lungimea sirului este: $n";
?>
Scriptul de mai sus va afisa:
Lungimea sirului este: 36
Lungimea sirului este: 27
Lungimea sirului este: 27
Lungimea sirului este: 27
Lungimea sirului este: 18
Descriere
chop(s)
ltrim(s)
rtrim(s)
trim(s)
2. Compararea sirurilor
PHP furnizeaza patru functii care sunt deosebit de utile pentru compararea sirurilor. Aceste
functii sunt enumerate n tabelul urmator.
Fiecare functie returneaza o valoare al carei semn determina rezultatul comparatiei; nu trebuie sa
ncercati sa interpretati valoarea returnata efectiva.
Functii PHP de comparatie ntre siruri
Functia
Descriere
strcasecmp(s1, s2)
strcmp(s1, s2)
strncmp(s1,s2, n)
Descriere
strchr(s1,s2)
stristr(s1,s2)
strpos(s1,s2)
strrchr(s1,s2)
strstr(s1,s2)
$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
Sa presupunem ca doriti sa specificati un sir care poate include orice vocala. Puteti face aceasta
folosind expresia regulata [aeiou]. Prin includerea valorilor posibile ntre paranteze, formati o
expresie regulata echivalenta cu formularea "alege oricare din aceste valori". Daca doriti sa
permiteti si utilizarea, majusculelor, puteti scrie [aeiouAEIOU].
Sa presupunem ca doriti sa specificati un sir care poate include orice caracter scris cu minuscule.
Puteti scrie: [abcdefghijklmnopqrstuvwxyz]. Sau puteti folosi o forma mai compacta [a-z],
unde prin cratima se ntelege "o serie de caractere consecutive".
Sa presupunem ca doriti sa specificati intr-o expresie regulata sirurile "sat", "mat" si "lat". Pentru
aceasta, aveti nevoie de expresia regulata [sml]at. Semnificatia acestei expresii regulate este
urmatoarea: "alege oricare din literele 's', 'm' si 'l' si scrie dupa litera respectiva literele 'at'".
Daca un accent circumflex (^) este primul simbol mentionat ntre parantezele drepte, acesta are
ca efect inversarea semnificatiei expresiei regulate plasate ntre paranteze.
De exemplu, expresia regulata [^a-z] corespunde oricarui caracter care nu este o litera
mica.
Pentru a specifica faptul ca o expresie regulata se poate repeta, expresia regulat va fi urmata de o
pereche de acolade, care includ limitele superioara si inferioara ale repetitiei.
De exemplu, expresia regulata [aeiou]{1,4} corespunde sirurilor care pot contine intre 1
si 4 vocale.
Pentru a specifica repetarea mai multor parti ale unei expresii regulate, includeti partile
respective ntre paranteze rotunde.
De exemplu, expresia regulata ([sml]at){1 ,2} corespunde unui numar de una sau doua
repetari ale oricaruia dintre sirurile "sat", "mat" sau "lat".
Pentru a simplifica scrierea de reguli intr-o expresie regulata se folosesc anumite caractere
"speciale"
Sa presupunem ca doriti sa reprezentati o nmultire intre doua numere, puteti obtine ceva de
genul [0-9]*[0-9]. Totusi, aceasta expresie regulata nu are semnificatia dorita, deoarece '*' este
un factor de repetitie, nu un caracter dintr-un sir. Pentru a dezactiva semnificatia speciala a
caracterului '*', trebuie sa-l prefixati cu un caracter backslash: [0-9]\*[0-9].
Pentru a specifica faptul ca o expresie regulata corespunde numai unui sub-sir care include
anumite caractere la inceput, prefixati expresia regulata cu un accent circumflex "^". De
exemplu, expresia regulata ^[sml]at corespunde sub-sirurilor "sat", "mat" sau "lat" numai daca
acestea apar la nceputul sirului subiect.
Similar, pentru a arata ca o expresie regulata corespunde numai unui sub-sir care include anumite
caractere la sfarsit, anexati la expresia regulata un simbol al dolarului "$". De exemplu, expresia
regulata [sml]at$ corespunde sirurilor "sat", "mat" sau "lat" numai daca acestea apar la sfrsitul
sirului subiect.
Iata o lista cu mai multe caractere speciale si rolul lor in expresiile regulate:
+ - 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)
(.*) - Reprezinta toate caracterele (prin .) repetate de cate ori e posibil (dat de *)
^The .* hack$ - Sirurile care incep cu "the " si se sfarsesc cu " hack"
^www.[a-z0-9]+.ro$ - Reprezinta sirurile "www.---.ro" unde '---' poate fi orice litera sau
cuvant ce contine litere mici si numere
^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})$ - Expresie
regulata pentru adrese de e-mail
Descriere
- Executa o identificare cu o expresie regulata (deprecata incepand cu
versiunea PHP 5.3 si anulata la PHP 6)
sql_regcase
Expresiile regulate compatigile Perl se adauga intre caractere "/". De exemplu sablonul ([a-z09]+) se foloseste /([a-z0-9]+)/.
Iata un exemplu cu preg_grep(), aceasta returneaza un array compus din elementele unei matrice
care contin sablonul, expresia regulata cautata. Acest exemplu va returna doar acele elementele
dintr-o matrice care contin in ele sub-sirurile "casa" sau "masa".
<?php
$matrice = array('123casa', 'abc masa', '12-xy', '$asa_0/', '123abc casa');
$filtru = preg_grep("/([cm]asa)/", $matrice);
print_r ($filtru);
// Afiseaza elementele matricei
?>
- Variabila "$matrice" contine un Array cu mai multe elemente cu siruri.
- In variabila $filtru e preluat rezultatul functiei "preg_grep()" a carei prim parametru este un
sablon de expresie regulata (adaugata intre ghilimele duble), iar al doilea este matricea in care e
cautat sablonul.
- Cu functia "print_r()" se va afisa elementele matricei obtinute in variabila "$filtru". Rezultatul
afisat e urmatorul:
Array ( [0]=>123casa [1]=>abc masa [4]=>123abc casa )
- Un ultim exemplu util, folosim functia preg_replace() si o expresie regulata pentru a elimina
caracterelor speciale dintr-un sir
<?php
$sir = 'Sir& ce contine*a <caractere: speciale? /in co@nte>xt';
$sir = preg_replace("/([^ A-Za-z0-9_]+)/", "", $sir);
echo $sir;
?>
In acest exemplu avem un sir (stocat in variabila $sir) ce contine diferite caractere mai putin
uzuale.
Functia "preg_replace", impreuna cu expresia regulata "/(^ A-Za-z0-9_]+)/", pastreaza in $sir
numai literele, cifrele, caracterul '_' si spatiu.
Instructiunea "echo" va afisa urmatorul rezultat:
Sir ce continea caractere speciale in context
Valorile majoritatii variabilelor dispar atunci cnd scriptul PHP care le contine si ncheie
executia. Spre deosebire de acestea, valorile variabilelor cookie se pot pastra un timp indefinit.
Pentru ca valorile lor sa se poata pastra, browserul utilizatorului stocheaza variabilele cookie n
unitatea de hard-disc a utilizatorului.
Majoritatea navigatoarelor de Web au posibilitatea sa activeze/dezactiveze cookie-urile. Trebuie
sa tineti cont de acest lucru cand doriti sa folositi cookie in scripturile dv., totusi, comform
statisticilor, in jur de 1% dintre utilizatori au optiunea cookie dezactivata.
PHP pune la dispozitia utilizatorilor functii pentru transmiterea cookie-urilor de la server la
browser, si modalitati de citire a cookie-urilor.
Pentru a citi cooki-urile puteti utiliza variabila PHP de tip tablou $_COOKIE sau
$_HTTP_COOKIE_VARS, acestea contin numele si valoarea fiecarei variabile cookie curenta.
Daca doriti sa obtineti acces la acest tablou, puteti folosi un program ca urmatorul:
- Argumentul 'numeCookie' specifica numele variabilei cookie, iar argumentul 'valoare' specifica
valoarea variabilei.
- Valoarea variabilei cookie este automat transmisa "urlencode" si cand este primita e automat
decodata.
- Argumentul 'expirare' indica momentul expirarii variabilei cookie; dupa ora specificata,
variabila cookie nu mai este accesibila.
n general, este convenabil sa se specifice momentul expirarii folosind functia time(), care
returneaza intervalul de timp (exprimat n secunde) scurs de la 1 ianuarie 1970. Puteti adauga o
valoare de tip decalaj (offset), care specifica intervalul de timp pe durata caruia variabila cookie
trebuie sa fie accesibila.
Folosind aceasta functie se pot transmite mai multe cookie-uri succesiv; protocoalele Web
limiteaza insa la maximum 20 numarul cookie-urilor ce pot fi trimise aceluiasi utilizator.
De exemplu, sa luam n considerare urmatoarea instructiune:
Aceasta instructiune creeaza o variabila cookie denumita 'fruct', care are valoarea 'banana'.
Variabila cookie va fi disponibila timp de o ora (3600 secunde) de la crearea sa.
Daca preferati, puteti specifica momentul expirarii folosind functia mktime(). Aceasta functie
are urmatoarea forma:
De exemplu, urmatoarea instructiune creeaza o variabila cookie care expira la o secunda dupa
miezul noptii primei zile a anului 2009:
permite sa specificati numele de domeniu asociat unei variabile cookie. n consecinta, variabila
cookie va fi disponibila numai pentru siturile Web din cadrul domeniului specificat. De exemplu,
sa presupunem ca un script din serverul Web http://www.subdomeniu.domeniu.com creeaza o
variabila cookie. n mod prestabilit, variabila cookie este disponibila numai pentru gazda
respectiva. Cu toate acestea, puteti face variabila cookie disponibila pe ntreg domeniul
'subdomeniu.domeniu.com', specificnd "subdomeniu.domeniu.com" ca valoare a argumentului
'domeniu'.
- Argumentul 'secure' este o valoare ntreaga, care specifica daca variabila cookie trebuie trimisa
prin intermediul unei conexiuni sigure (HTTPS). Specificati valoarea l pentru a mpiedica
transmiterea variabilei cookie n cazul n care conexiunea nu este sigura; pentru a permite
transmiterea variabilei cookie prin conexiuni HTTP obisnuite, specificati valoarea 0.
Descriere
file_exists()
fileatime()
filectime()
filetype()
is_dir()
is_file()
is_readable()
is_writable()
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 cte trei caractere fiecare; cu alte
cuvinte, trei triade. Prima triada indica privilegiile acordate posesorului fisierului. Cea de-a doua
triada indica privilegiile acordate membrilor grupului posesor al fisierului. Cea de-a treia triada
indica privilegiile acordate altor utilizatori.
Cele 3 caractere care alcatuiesc un grup sunt reprezentate, in sistemele UNIX, prin urmatoarele
tri litere: 'r', 'w' si 'x'; acestea reprezinta:
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--
"r-x", membrii grupului posesor al fisierului pot citi sau executa fisierul, dar nu pot scrie
n fisier
"r--", alti utilizatori pot citi fisierul, dar nu pot scrie n fisier sau executa continutul
fisierului
Privilegiul 'x' este semnificativ numai pentru fisierele care includ un continut executabil, cum
sunt fisierele binare executabile (.exe) sau anumite categorii de scripturi.
Posesorul unui fisier poate modifica privilegiile asociate fisierului emitnd comanda chmod
(aceasta functioneaza in sistemele de operare UNIX).
Aceasta comanda are doua forme. O forma va permite sa specificati privilegiile folosind cifre
scrise n octal; cealalta va permite sa le specificati folosind litere.
Pentru a specifica privilegiile folosind cifre n octal, calculati valoarea numerica a fiecarei triade.
Pentru aceasta, nsumati numerele corespunzatoare fiecarui privilegiu disponibil din cadrul
triadei. Numerele asociate privilegiilor sunt urmatoarele:
r-4
w-2
x-1
De exemplu, privilegiul "rwx" are valoarea 4 + 2 + 1 = 7. Similar, privilegiul "r-x" are valoarea 4
+ l = 5, iar privilegiul "r--" are valoarea 4.
Dupa ce ati calculat valoarea numerica a fiecarei triade, formati un numar din trei cifre scris n
octal, care este alcatuit din valoarea numerica a privilegiilor utilizatorilor, valoarea numerica a
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--" specificnd 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.
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:
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:
Sub Microsoft Windows, fisierele ASCII si fisierele binare sunt tratate n mod diferit. Cnd
deschideti un fisier binar sub Windows, specificati "b" ca al doilea caracter al modului; de
exemplu, "rb" pentru citire, "wb" pentru scriere, "a+b" pentru citire si adaugare. Daca nu
procedati astfel, citirile din fisier si alte operatii se vor ncheia prematur sau vor esua.
fclose(identificator_fisier)
$s = fread($fh, 256);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
Exemplul citeste maximum 256 de octeti din fisier daca fisierul a fost deschis.
- Am folosit caracterul @ in fata functiei "fopen()" pentru a impedica afisarea erorilor de la
server in cazul cand fisierul nu poate fi deschis. Este deja functia "if()" care verifica si afiseaza
mesaj in caz de nedeschidere a fisierului.
Pentru a citi un numar mai mare sau mai mic de octeti, modificati valoarea argumentului lungime
al functiei fread().
PHP include o functie conexa, denumita fgetc(), care citeste un octet din fisierul specificat.
Pentru a citi si a afisa ntregul continut al fisierului, puteti folosi functia filesize() pentru a
furniza valoarea argumentului lungime, astfel:
<?php
$nume = "carte.txt";
$fh = @fopen($nume, "rb");
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
else {
$l = filesize($nume);
$s = fread($fh, $l);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
if (!$fh) {
echo "Nu a fost deschis fisierul carte.txt.";
}
else {
$s = fgets($fh, 126);
echo "<br /> Citeste: $s";
fclose($fh);
}
?>
- In exemplul de mai sus, daca prima linie din fisierul "carte.txt" are mai mult de 125 de
caractere, va afisa doar primele 125, daca are mai putin de 125 de caractere, va afisa doar
caracterele care sunt incluse in prima linie.
<?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.
readfile("carte.txt");
$s = fgets($fh, 256);
echo "<br /> Citeste : $s";
}
// Deruleaza la inceputul fisierului si reia redarea acestuia
rewind($fh);
while (!feof($fh)) {
$s = fgets($fh, 256);
echo "<br /> Citeste \$s : $s";
}
fclose($fh);
?>
Daca se produce vreo eroare, functia rewind() returneaza zero.
Desi functia rewind() este utila n caz de nevoie, necesitatea de a readuce un pointer de fisier la
nceputul fisierului nu este chiar att de frecventa.
Functia fseek() furnizeaza o mai mare flexibilitate, permitndu-va sa pozitionari pointerul de
fisier astfel nct sa puteti citi sau scrie n orice punct al fisierului.
Functia are doua forme, cea mai simpla fiind urmatoarea:
fseek(identificator_fisier, offset)
unde 'identificator_fisier' este identificatorul de fisier returnat de functia fopen(), iar 'offset' este
pozitia dorita a pointerului de fisier, specificata n octeti, n raport cu nceputul fisierului.
In caz de reusita, functia fseek() returneaza 0; n caz contrar, returneaza -l .
O forma alternativa a functiei asigura un grad superior de flexibilitate, avand urmatoarea forma:
fseek(identificator_fisier, offset, baza)
unde 'identificator_fisier' si 'offset' au semnificatiile definite anterior, iar 'baza' ia una ; dintre
urmatoarele valori:
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.
Aceasta forma include un al treilea argument, si anume "lungime", care va permite sa specificati
numarul maxim de octeti care vor fi scrisi.
Argumentul "lungime" al functiei fwrite() trebuie utilizat atunci cnd se scrie n fisiere binare
sub Microsoft Windows.
Windows prefera secventa de terminare a liniei "\r\n". Atunci cnd scrieti programe PHP pentru
sisteme Windows, este de preferat sa folositi secventa "\r\n" de terminare a liniei.
- PHP dispune de o alta functie pentru scrierea fisierelor, fputs(). Totusi, n afara de nume,
fputs() este similara cu functia fwrite().
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);
echo $dir;
?>
// marplo.net/php-mysql
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):
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 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");
// Parcurge fisierul pana ajunge la sfarsit (atunci "feof" e TRUE - adica "!feof" e FALSE)
while(!feof) {
}
fclose($fo);
?>
11. file_exists("fisier")
- Returneaza TRUE daca "fisier" exista, altfel, returneaza FALSE.
<?php
if (file_exist('dir/file.ext')) echo 'Fisierul exista';
else echo 'Fisierul nu exista';
?>
12. file_get_contents("fisier")
- Returneaza tot continutul din "fisier" intr-un sir. Daca "fisier" nu poate fi citit, returneaza
FALSE.
13. file_put_contents("fisier", "continut")
- Scrie in "fisier" sirul specificat la "continut". Daca fisierul exista, suprascrie datele existente,
daca nu exista, il creaza. Daca nu poate scrie in "fisier", returneaza FALSE.
<?php
$file = 'cursuri.php';
$context = file_get_contents($file);
// Preia continutul fisierului
$context .= 'Sir nou adaugat dupa cel existent';
file_put_contents($file, $context);
?>
echo $aray_file[0];
?>
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:
?>
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.
19. flock(file_pointer, flag)
- Blocheaza / deblocheaza accesul de citire sau scriere la un fisier deschis cu "fopen()", specificat
la "file_pointer". Returneaza TRUE, sau daca functia esueaza, FALSE. Modul de blocare, sau
deblocarea, se specifica la "flag", acesta putand fi:
LOCK_UN - deblocare
<?php
$fo = fopen("fisier.txt", "r+");
if (flock($fo, LOCK_EX)) {
// blocheaza alt acces la fisier pt scriere
fwrite($fo, "Scrie ceva in el.");
flock($fo, LOCK_UN);
// Elibereaza blocarea
} else {
echo "Nu poate bloca fisierul!";
}
fclose($fo);
?>
20. fseek(file_pointer, pozitie)
- Muta pozitia pointer-ului dintr-un fisier deschis cu "fopen()" la numarul de caractere specificat
de "pozitie" (0 e primul caracter). In caz de succes returneaza 0, altfel, -1.
<?php
$fo = fopen('somefile.txt', 'r+b');
fseek($fo, 199);
// Muta pointerul in fisier la al 200-lea caracter
?>
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);
?>
22. fwrite(file_pointer, 'sir')
- Scrie intr-un fisier deschis cu "fopen()" (specificat la "file_pointer") continutul din "sir".
<?php
// Daca poate deschide fisierul pt. adaugare date
if ($fo = fopen('tutorial.txt', "a+b")) {
// /www/htdocs
// index.php
// php
// index (incepand cu PHP 5.2.0)
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
?>
32. rename("nume", "nume_nou"
- Redenumeste un director sau fisier specificat la "nume", cu "nume_nou". In caz de succes
returneaza TRUE, altfel FALSE.
<?php
rename("dir/file.txt", "dir/my_file.txt");
?>
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);
// Afiseaza locatia unde e acum pointer-ul in fisier
echo ftell($fo);
// 11
rewind($fo);
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.";
?>
else {
$s = fgets($fh, 7);
$count = (int) $s;
$count = $count + 1;
rewind($fh);
fwrite($fh, $count);
echo "<br /> Nr. vizitari: $count";
fclose($fh);
}
?>
Remarcati functiile pe care le foloseste scriptul pentru a executa operatiile cu fisiere. Programul
deschide fisierul "ctr.txt" pentru citire si scriere, preia datele din acesta, care sunt un numar
intreg, mareste acel numar cu o unitate, intoarce pointerul la inceputul fisierului "rewind" dupa
care rescrie noul numar, afiseaza numarul si inchide fisierul.
Secventa de cod descrisa mai sus poate creea probleme in cazul in care, de exemplu doi
utilizatori diferiti acceseaza acelasi fisier, in acelasi timp, cand contoarul este, de exemplu, la
numarul 100. Amandoi vor incrementa numarul 100 cu o unitate si va rescrie in fisierul "ctr.txt"
101; in final, contoarul va arata 101, in loc de 102 cum ar fi trebuit (deoarece au fost 2 vizitatori).
Pentru a evita astfel de conflicte PHP pune la dispozitia utilizatorilor o metoda prin care se poate
bloca accesul temporar la un fisier. Pe durata blocarii, un alt utilizator nu va mai putea scrie/citi
din acest fisier. De aceea durata blocarii trebuie sa fie limitata.
Functia care realizeaza blocarea este flock(), care are urmatoarea forma:
flock(identificator_fisier, operatie)
Iata cum se foloseste procesul de blocare, vom folosi acelasi exemplu, contoarul de mai sus, de
data aceasta imbunatatit.
<?php
$contor = "ctr.txt";
$fh = @fopen($contor, "r+b");
if (!$fh) {
echo "Nu a fost deschis fisierul ctr.txt.";
}
else {
flock($fh, LOCK_EX);
$s = fgets($fh, 7);
}
?>
- Exemplu modifica numele fisierului "test.txt" in "teste.dat".
Alege fisierul:
<input type="file" name="fisier" /> <br />
<input type="submit" name='submit' value="Trimite" />
</form>
- Cnd utilizatorul apasa pe butonul de "Trimite", scriptul PHP preia datele si va incarca fisierul
dorit in server
Invatati sa cititi continutul unui director, sa-l redenumiti si sa creati noi directoare
Cele mai importante functii pentru utilizarea cataloagelor va permit sa obtineti catalogul de lucru
si sa lucrati cu acesta, sa manipulati cai de acces, sa cititi continutul unui director, sa vizualizati
si sa modificati privilegiile unui director, precum si sa creati si sa stergeti cataloage.
In acest context, numele "catalog" si "director" reprezinta acelasi lucru.
"plomar/curs-php/lectii".
Functia are urmatoarea forma:
dirname(cale_fisier)
Functia basename() executa operatia complementara, returnnd numai componenta finala a caii
specificate.
De exemplu, daca este data calea "plomar/curs-php/lectii/lectia1.php", functia "basename()" va
returna "lectia1.php".
Functia are urmatoarea forma:
basename(cale_fisier)
Daca doriti sa executati mai multe operatii cu o cale, functia pathinfo() va poate fi de folos.
Aceasta functie returneaza un tablou care include patru elemente (al patrule incepand de la
versiunea PHP 5.2.0):
4. filename - numele fisierului dat de rezultatului functiei basename(), dar fara extensie
php
lectia1
Rezultatul apelarii functiei readdir() este un sir care contine numele urmatorului fisier sau subdirector din catalogul deschis. Functia returneaza FALSE atunci cnd au fost citite toate intrarile
din catalog.
Iata un exemplu care prezinta modul de utilizare a acestor functii pentru citirea continutului unui
catalog:
<?php
$dc = @opendir("home/plomar/curs-php");
if (!$dc) {
echo "Directorul nu a putut fi deschis";
}
else {
while ($ok = readdir($dc)) {
echo "<br /> $ok";
}
closedir($dc);
}
?>
Datele de iesire ale exemplului pot fi similare cu cele prezentate mai jos :
style
imgs
lectia
scripts
index.php
- 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.
Lucrurile se desfasoara ca in felul urmator: in momentul cand un user s-a logat la site, PHP
atribuie acestuia un identificator unic de sesiune : SID. Acest SID este inglobat intr-un coockie
cu numele PHPSESSID si trimis apoi catre browserul utilizatorului. Daca browserul nu suporta
cookie-uri sau acestea sunt dezactivate, atunci acest SID este adaugat la adresa URL. In acelasi
timp se creeaza pe server un fisier cu numele SID. In continuare daca utilizatorul doreste sa
stocheze anumite informatii, acestea vor fi practic scrise in acest fisier SID de pe server.
Sesiunile au urmatoarele avantaje:
- Pot fi folosite chiar daca browserul utilizatorului nu suporta cookie-uri sau daca acestea
sunt dezactivate.
- Permit stocarea unui volum mare de informatii, spre deosebire de cookie-uri care sunt
limitate in aceasta privinta.
- Sunt mai sigure in raport cu cookie-urile deoarece informatiile nu sunt transmise in mod
repetat intre client si server.
session_start()
Aceasta trebuie sa fie printre primele linii de cod dintr-un script PHP, deoarece apelul acestei
functii trebuie facut inainte de trimiterii catre browser-ul Web a vreunui cod HTML sau chiar a
unui spatiu vid.
Daca folosim stocarea iesirii in buffer, instructiunea session_start() nu trebuie inserata neaparat
la inceputul codului.
Instructiunea session_start() nu este necesare daca in fisierul de configurare "php.ini", variabila
"session.auto_start" are valoarea TRUE.
Pentru a intelege mai bine modul de lucru cu sesiuni si functia session_start(), folosim un
exemplu in care avem o pagina principala "a.php" unde cream o variabila cu numele
"userName", atribuindu-i valoarea "MarPlo", pe care o stocam intr-o sesiune PHP, pagina contine
o legatura catre o alta pagina "b.php", aceasta din urma va folosi functia session_start() pentru a
prelua, prin sesiune, valoarea variabilei "user_name" din pagina "a.php", astfel putem folosi
valoarea acestei variabile intr-un script din pagina "b.php".
Continutul fisierului "a.php" este urmatorul:
<?php
//Fisierul a.php
session_start();
if(!isset($_SESSION['userName']))
$_SESSION['userName'] = "MarPlo";
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<?php
echo "<br /> Identificatorul sesiunii curente SID este:". session_id();
//Va afisa un rezultat asemanator cu: "Identificatorul sesiunii curente SID
este:2846240682abf24a09f42664fc03bbf3"
?>
Functia session_id() accepta un parametru. Astfel putem seta un anumit SID pentru sesiunea
curenta. In acest caz trebuie sa apelam functia session_id() inainte de functia : session_start(),
ca in exemplul urmator:
<?php
session_id('123abc');
session_start();
echo "<br /> Identificatorul sesiunii curente SID = ". session_id();
//Va afisa rezultatul: "Identificatorul sesiunii curente SID = 123abc"
?>
Deoarece variabilele de sesiune pot fi citite de alti utilizatori neautorizati, nu este indicat sa
pastram aici informatii esentiale cum sint parolele.
Pentru a creea un minimum de securitate putem codifica aceste informatii, folosind functtile de
codare oferite de PHP:
<?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".
unset($_SESSION);
unset($_SESSION['nume_variabila']);
Datele sesiunii sunt memorate in server in fisiere temporare. Pentru a sterge datele sesiunii din
server folositi:
session_destroy()
Nume
AnNastere
001
George Washington
1732
002
John Adams
1735
003
Thomas Jefferson
1743
Primul rnd al tabelului atribuie nume pentru fiecare coloana.
Fiecare rnd al tabelului, altul dect primul rnd, descrie o singura personalitate. De exemplu, al
doilea rnd descrie o personalitati pe nume George Washington.
Fiecare coloana, descrie un anumit atribut al personalitatii De exemplu, a doua coloana contine
numele personalitatilor, iar a treia coloana contine anii n care s-au nascut acestia.
Pentru a se putea face referire, mai usor, la un anumit rnd al tabelului, se obisnuieste ca fiecare
tabel sa contina o coloana care identifica n mod unic fiecare rnd. Aceasta coloana se numeste
"cheia primara" a tabelului. In exemplul prezentat, coloana numita "PersoanaID" serveste drept
cheie primara.
Daca nici o coloana nu contine o valoare unica pentru fiecare rnd, se pot combina valorile mai
multor coloane pentru a crea o "cheie primara compusa".
O baza de date relationala se numeste astfel datorita capacitatii sale de a stabili relatii ntre date
PersoanaID
001
George Washington
1732
Arhitect
003
002
John Adams
1735
General
001
003
Thomas Jefferson
1743
Filozof
002
Al doilea tabel contine informatii despre meseriile caracteristice ale persoanelor prezentate in
exemplul anterior. Mai precis, tabelul identifica persoana cu o anumita meserie. Numele meseriei
serveste drept cheie primara a tabelului, care mai contine, n afara de aceasta, o singura coloana.
Coloana respectiva stocheaza atributul "PersoanaID" din primul tabel, al persoanei care cunoaste
meseria descrisa de un anumit rnd. De exemplu, angajatul cu numarul 003 este arhitect.
Retineti ca "PersoanaID" este att cheia primara a tabelului original, dar si o coloana din noul
tabel. Coloana "PersoanaID" a noului tabel se numeste "cheie externa"; desi nu este cheia
primara a noului tabel, este cheia primara a unui alt tabel.
Aplicatia software care gazduieste o baza de date se numeste "sistem de gestiune a bazelor de
date" (SGBD). Exista multe sisteme de gestiune a bazelor de date, printre cele mai populare
asemenea sisteme se numara: DB2 , Interbase , MySQL , Oracle , Postgresql , SQL Server ,
Sybase .
MySQL este cel mai popular sistem de gestiune a bazelor de date destinat utilizarii cu PHP, n
mare masura deoarece este gratuit. Totusi, prin intermediul PHP este posibil accesul la aproape
orice SGBD modern.
Bazele de date relationale nteleg SQL (Structured Query Language), un limbaj relativ simplu,
folosit pentru solicitarea datelor. In ciuda simplitatii sale, SQL este un limbaj foarte puternic,
care poate obtine accesul la date stocate n mai multe tabele, poate filtra datele dorite si poate
sorta, rezuma si afisa rezultatele.
n general, bazele de date relationale si stocheaza datele ntr-un singur fisier sau catalog. Aceasta
caracteristica de organizare faciliteaza administrarea datelor, deoarece executarea copiei de
siguranta, respectiv restaurarea unui singur fisier sau catalog se realizeaza mai usor.
Sistemele de gestiune a bazelor de date relationale necesita mai multe cicluri de procesor pentru
a satisface o cerere de date dect cele necesare pentru accesul la un fisier normal, dar ofera
protectie sporita a datelor, iar pentru accesul la distanta usureaza traficul deoarece majoritatea
operatiilor sunt efectuate de programul SQL, astfel singurele date transmise in retea ar fi
rezultatul cerut.
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
BLOB
CHAR(m)
DATE
Descriere
- Date binare arbitrare, cu o lungime maxima de 65535 octeti
- Un sir de caractere de lungime fixa, cu un maxim de m caractere, unde
m este mai mic dect 256. Pentru obtinerea lungimii dorite, se insereaza
spatii finale
- O data n format an-luna-zi; de exemplu 2008-10-15
DECIMAL
DECIMAL(m,d)
- Un numar zecimal, reprezentat sub forma de sir cu "m" cifre, din care
"d" se afla la dreapta punctului zecimal. Daca "m" si "d" sunt omise, n
mod prestabilit se vor utiliza valorile 10 si 0
DOUBLE
DOUBLE (m, d)
FLOAT(m,d)
- Similar cu DECIMAL
REAL
REAL(m, d)
- Similar cu DOUBLE
VARCHAR(m)
- Alegeti BLOB ca tip pentru datele pe care nu trebuie sa le manipulati si la care nu veti
obtine acces prin intermediul limbajului SQL.
- Alegeti un tip data sau ora adecvat pentru coloanele care contin date calendaristice sau
ore.
- Alegeti un tip numeric pentru coloanele folosite pentru numere sau n calcule.
o - Pentru cantitati foarte mari sau foarte mici, alegeti DOUBLE ca tip de date.
o - Pentru coloane care contin numere fara parte zecimala de dimensiuni medii,
alegeti SMALLINT sau INTEGER ca tip de date.
o - Pentru alte coloane care contin date numerice, alegeti DECIMAL ca tip de date.
- Alegeti CHAR sau VARCHAR ca tip pentru celelalte coloane, chiar si pentru cele care
contin cifre, cum ar fi un cod postal.
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:
Unde "tabel" este numele tabelului, "coloana" este numele unei coloane, "tip" este tipul datelor
incluse n coloana, se poate specifica un numar nedefinit de coloane.
De exemplu, comanda urmatoare creeaza un tabel numit "carte", care contine coloanele
"carteid", "titlu" si "pret":
CREATE TABLE carte (carteid CHAR(10), titlu VARCHAR(255), pret decimal(5,2));
- n afara tipului de date, intre paranteze, puteti specifica si alte atribute optionale ale unei
coloane:
NOT NULL - Fiecare rnd trebuie sa contina o valoare a coloanei asociate; valorile nule
nu sunt permise.
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);
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:
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:
Unde "tabel" este numele tabelului, "utilizator" este numele contului de utilizator, iar "parola"
este parola pe care o va furniza utilizatorul pentru a-si proba identitatea.
Alternativ, administratorul de sistem poate autoriza un utilizator sa obtina acces la orice tabel
dintr-o baza de date specificata, folosind urmatoarea forma a comenzii "GRANT":
De exemplu, pentru a revoca toate privilegiile (din toate bazele de date) utilizatorului "tip_rau",
scrieti comanda:
REVOKE ALL ON *.* FROM tip_rau;
Comanda "GRANT" are si o forma mai complexa pentru a autoriza accesul numai la anumite
coloane specificate. Forma avansata a acestei comenzi este:
- Unde "privilegiu" este privilegiul care urmeaza a fi extins, "coloane" sunt coloanele carora li se
aplica privilegiul, iar "tabel", "baza_de_date", "utilizator" si "parola" au semnificatiile cunoscute.
Sunt permise si forme similare ale comenzii REVOKE:
SELECT - care permite accesul de citire la rndurile care contin coloana specificata
De exemplu, pentru a permite unui utilizator sa obtina accesul la o coloana, fara a o modifica,
puteti folosi o secventa de comenzi similara cu urmatoarea:
REVOKE ALL ON carte FROM Marius;
GRANT
SELECT(carteid, titlu, pret),
INSERT(carteid, titlu, pret),
UPDATE(carteid, titlu, pret)
ON carte TO php IDENTIFIED BY 'mypassword';
REVOKE INSERT(pret) ON carte FROM Marius;
REVOKE UPDATE(pret) ON carte FROM Marius;
- Prima comanda revoca toate privilegiile de la nivelul tabelului; n caz contrar, aceste privilegii
le vor elimina pe cele situate la nivel de coloana.
Pentru a vedea privilegiile acordate unui anumit utilizator, folositi urmatoarea comanda:
Caracteristica privilegiilor furnizata de MySQL este mai sofisticata si furnizeaza mult mai multe
optiuni. Pentru mai multe informatii, consultati manualul SQL de la adresa www.mysql.com
- Unde "tabel" este numele tabelului, iar "coloana1" si "coloana2" sunt coloanele la care se va
obtine accesul si al caror continut va fi afisat.
Puteti specifica mai multe coloane, separate prin virgula.
Daca vreti sa fie selectate numai acele rnduri care satisfac un anumit criteriu, clauza "WHERE"
va permite sa specificati o conditie; rndurile care nu satisfac conditia nu sunt raportate.
De exemplu, iata o interogare care raporteaza un singur rnd:
SELECT titlu, pret FROM carte WHERE carteid=1;
Forma conditiilor folosite n sub-limbajul DML al limbajului SQL este similara cu aceea a
conditiilor PHP. Puteti folosi oricare din urmatorii operatori relationali:
<>
Inegalitate
!=
Inegalitate, diferit de
<
>
<=
=>
Egalitate
Puteti compara valoarea unei coloane cu aceea a altei coloane, respectiv valoarea unei coloane cu
o valoare string. Valorile string SQL (sirurile) trebuie sa fie incluse ntre ghilimele simple, nu
ntre ghilimelele duble.
Cnd unei coloane nu i-a fost repartizata nici o valoare, SQL i atribuie valoarea speciala NULL.
De asemenea, programatorii pot atribui n mod explicit valoarea NULL unei coloane.
Comparatiile obisnuite cu valori NULL, care folosesc operatorii de (in)egalitate, vor returna un
rezultat fals. Totusi, puteti folosi operatorul special "<=>". care compara valorile tinnd cont de
valoarea NULL. Daca folositi acest operator pentru a compara doua valori NULL, se obtine un
rezultat adevarat.
SQL include si numerosi operatori de comparatie non-algebrici:
Operator
Descriere
x BETWEEN y AND z Adevarat, daca valoarea lui x este cuprinsa ntre valorile lui y si z
x LIKE y
x NOT LIKE y
x IN (y1, y2)
x NOT IN (y1, y2)
x IS 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:
De exemplu, urmatoarea interogare raporteaza rndurile care au pretul de carte mai mare dect
11 sau al caror titlu include sub-sirul 'Curs':
SELECT titlu, pret FROM carte
WHERE pret>11 OR titlu LIKE %Curs%;
Pentru a compara o valoare cu o expresie regulata n MySQL, folositi urmatoarea forma:
x REGEXP y, unde "x" este valoarea care va fi testata, iar "y" este o expresie regulata,
delimitata prin ghilimele simple.
Unde coloana denumita "coloana1" primeste valoarea "valoare1", iar coloana denumita
"coloana2" primeste valoarea "valoare2".
Pot fi specificate mai mult sau mai putin de doua coloane si valori. Numarul coloanelor
specificate trebuie sa fie egal cu numarul valorilor specificate.
Coloanele care nu sunt denumite n comanda "INSERT" si care nu au o valoare prestabilita
(DEFAULT) primesc valoarea NULL, cu exceptia situatiilor cnd valoarea respectiva nu este
permisa (n acest caz, comanda INSERT esueaza).
Daca doriti sa adaugati mai multe randuri intr-un tabel, intr-o singura inserare, puteti folosi
urmatoarea forma a comenzii INSERT:
Pentru a modifica valoarea unui rnd sau mai multor rnduri existente ntr-un tabel, folositi o
comanda "UPDATE", care are urmatoarea forma:
- Unde "tabel" este numele tabelului ale carui rnduri urmeaza sa fie modificate, "coloana1" este
numele primei coloane care urmeaza a fi modificata, "valoare1" este valoarea care va fi
repartizata n "coloana1", "coloana2" este numele celei de-a doua coloane care urmeaza a fi
modificata, "valoare2" este valoarea care va fi repartizata n "coloana2", iar "conditie" identifica
rndul sau rndurile care urmeaza a fi actualizate, dupa o anumita conditie.
Poate fi actualizat un numar mai mare sau mai mic de coloane. Daca se doreste ca toate
randurile coloanei sa fie actualizate, clauza "WHERE" poate fi omisa.
De exemplu, comanda urmatoare modifica din coloana "titlu" numele asociat cartii in "Curs2", in
randul unde coloana "pret" are valoarea 5.
UPDATE carte SET titlu=Curs2
WHERE pret=5;
Pentru a sterge un rnd dintr-un tabel, folositi comanda "DELETE", care are urmatoarea forma:
Daca se vrea a fi sterse toate rndurile tabelului, clauza WHERE poate fi omisa.
De exemplu, comanda urmatoare sterge rndul din tabelul "carte" asociat titlului "Curs2":
DELETE FROM carte WHERE titlu='Curs2';
4. Sortarea si gruparea
Deseori, este important ca datele sa fie raportate ntr-o anumita secventa. Puteti specifica ordinea
de raportare a rezultatelor interogarii folosind clauza "ORDER BY", care are urmatoarea forma:
ORDER BY valoare
Daca se vor folosi mai multe cmpuri de sortare, acestea vor fi separate prin virgula.
Daca doriti sa indicati o sortare descendenta, n locul uneia ascendente, specificati "DESC" dupa
valoare.
De exemplu, pentru a ordona toate cartile n functie de pret, de la cel mai mare la cel mai mic,
respectiv dupa titlu pentru un pret egal, puteti folosi urmatoarea interogare:
SELECT pret, titlu FROM carte
ORDER BY pret DESC, titlu;
Pentru a include numai titlurile care au un pret mai mare de 50, adaugati o clauza WHERE la
comanda SELECT:
SELECT pret, titlu FROM carte
WHERE pret>50
ORDER BY pret DESC, titlu;
SQL include functii care va permit sa raportati valori diferite, valori utile, precum un numar al
rndurilor tabelului. Iata cele mai importante functii in acest sens:
Functie
Descriere
count(*)
count(coloana)
count(distinct coloana)
avg(coloana)
min(coloana)
max(coloana)
sum(coloana)
- Suma valorilor din coloana specificata
De exemplu, interogarea urmatoare raporteaza numarul cartilor si pretul mediu al acestora:
SELECT count(*), avg(pret) FROM carte;
- Datele de iesire vor fi afisate pe o singura linie.
Clauza SQL "AS" specifica un nume nou pentru o coloana sau expresie. Numele specificat este
folosit ca titlu n rapoartele SQL. Clauza "AS" este utila n lucrul cu functiile din tabelul anterior,
va ajuta sa identificati mai usor datele de iesire.
De exemplu, interogarea precedenta poate fi rescrisa pentru a include o clauza "AS", astfel:
SELECT count(*) AS Carte_Numar,
avg(pret) AS Pret_Mediu
FROM carte;
O alta clauza utila este "GROUP BY", aceasta are urmatoarea forma:
GROUP BY coloana-sortare
- Unde "coloana-sortare" este numele sau valoarea unei coloane, specificata ntr-o clauza
"ORDER BY", care trebuie sa urmeze dupa clauza "GROUP BY".
De exemplu, avem un tabel "carte" cu 4 coloane (carteid, titlu, anul si pret), interogarea
urmatoare raporteaza numarul cartilor si pretul mediu pentru fiecare an (anul) n parte:
SELECT count(*), avg(pret) FROM carte
GROUP BY anul
ORDER BY anul;
Pentru a include n datele de iesire numai grupurile selectate, specificati clauza "HAVING"
imediat dupa clauza "GROUP BY". Clauza "HAVING" are urmatoarea forma:
HAVING conditie
De exemplu, pentru a include numai cartile al caror atribut "anul" are valoare mai mare dect
1980, srieti urmatoarea interogare:
SELECT count(*), avg(pret) FROM carte
GROUP BY anul
HAVING anul>1980
ORDER BY anul;
Mai jos sunt afisati operatorii matematici folositi in SQL:
+
*
/
|
&
>>
<<
_
Adunare
Scadere
Inmultire
Impartire
SAU, la nivel de bit
SI la nivel de bit
Deplasare la dreapta
Deplasare la stanga
Complement la nivel de bit
1. Expresii si functii
SQL va permite sa formati expresii folosind valori din coloane, valori literale si functii. Ca si n
PHP, puteti controla ordinea de evaluare a expresiilor SQL folosind paranteze pentru a delimita
sub-expresiile care trebuie evaluate mai intai.
Tabelele urmatoare rezuma functiile MySQL frecvent folosite
Functii matematice frecvent folosite n MySQL
Functie
Descriere
abs(x)
atan(x)
atan2(y,x)
ceiling(x)
cos(x)
exp(x)
floor(x)
log (x)
mod(x,y)
power(x,y) - x la puterea y
rand(x)
sign(x)
- Valoarea -1, 0 sau 1, dupa cum valoarea lui x este negativa, zero
sau pozitiva
sin(x)
sqrt(x)
tan(x)
Functie
Descriere
ascii(s)
char(n)
minuscule
left(s,n)
length(s)
locate(s1, s2)
ltrim(s)
right(s,n)
rpad(s1,n,s2)
rtrim(s)
space(n)
substring(s,m,n)
trim(s)
ucase(s)
Functie
Descriere
minute(t)
month(d)
now()
second(t)
week(d)
year(d)
Functie
database()
Descriere
- Returneaza numele bazei de date deschise
password(s)
version()
2. Uniri
SQL va permite sa obtineti accesul la mai multe tabele ntr-o singura interogare, n general,
aceasta operatie se executa pentru ca datele dintr-un tabel sa poata fi folosite cu date din alt tabel.
De exemplu, sa presupunem ca baza de date este asemanatoare celei prezentate mai jos, unde
avem doua tabele, primul numit "persoane" iar cel de-al oilea numit "meserii", si o relatie cheie
externa - cheie primara (persoanaid) asociaza cele doua tabelele.
persoanaid
nume
AnNastere
meserie
persoanaid
001
George Washington
1732
Arhitect
003
002
John Adams
1735
General
001
003
Thomas Jefferson
1743
Filozof
002
Sa examinam urmatoarea interogare:
SELECT nume, meserie FROM persoane, meserii
WHERE persoane.persoanaid=meserii.persoanaid;
- Constructiile "persoane.persoanaid" si "meserii.persoanaid" se numesc "nume definite", prima
se refera la coloana "persoanaid" din tabelul "persoane", iar a doua se refera la coloana
"persoanaid" a tabelului "meserii".
- Clauza WHERE asigura o echivalenta ntre valoarea cheii externe din tabelul "meserii" cu
aceea a cheii primare din tabelul "persoane", (n absenta clauzei WHERE, se va stabili o
corespondenta ntre fiecare rnd din tabelul cu meserii si fiecare rnd din tabelul cu persoane; un
asemenea rezultat, numit "produs cartezian", contine n general multe rnduri - majoritatea
nedorite - si ca atare trebuie evitat).
- Rezultatul interogarii de mai sus este un raport care indica numele si meseria asociata fiecarui
angajat prezentat n tabelul "meserii".
O interogare ca aceasta, care combina date din mai multe tabele, se numeste "unire". Sunt
posibile si uniri mai complexe, care implica trei sau mai multe tabele.
Daca un rnd dat din tabelul principal (aici "persoane") nu are nici un rnd asociat n tabelul cu
detalii (aici "meserii"), rndul respectiv din tabelul principal nu va aparea n datele de iesire ale
unei uniri. In cazul acesta, pentru a determina aparitia acestei nregistrari din tabelul principal, se
poate folosi o categorie speciala de unire, cunoscuta sub numele de "unire la stnga" sau "unire
exterioara la stnga". Iata un exemplu:
SELECT nume, meserie FROM persoane
LEFT JOIN meserii
ON persoane.persoanaid=meserii.persoanaid;
Aceasta interogare va afisa toate persoanele, indiferent daca acestea au sau nu asociata o meserie.
Persoanele fara o meserie au specificatia NULL n coloana corespunzatoare meseriei.
SOURCE nume_fisier
Unde "nume_fisier" este calea si numele fisierului in care se afla scriptul de shell.
De exemplu, scriem urmatoarele comenzi intr-un fisier numit "lucru.txt" pe care-l salvam in
directorul "C:/teste".
CREATE DATABASE lucrudb;
USE lucrudb;
GRANT ALL ON lucrudb.* TO php IDENTIFIED BY 'mypass';
CREATE TABLE angajat (
angajatnr SMALLINT PRIMARY KEY,
nume VARCHAR(50),
ore SMALLINT,
departament CHAR(16),
salariu DECIMAL(8,2),
data_angajare DATE);
INSERT INTO angajat (
angajatnr,
nume,
ore,
departament,
salariu,
data_angajare)
VALUES (
1,
'George Washinton',
40,
'Contabilitate',
500.00,
'2007-10-04'),
( 2,
'John Adams',
35,
'Marketing',
1000.00,
'2007-10-11'),
( 3,
'Thomas Jefferson washinton',
20,
'Vanzari',
1300.00,
'2007-07-02');
- Pentru a executa acest script, scriem in fereastra de comanda MySQL: SOURCE
C:/teste/lucru.txt
MySQL va executa comenzile din script ca si cum acestea ar fi scrise direct in linia de comanda.
Exemplul de mai sus va crea o baza de date noua, numita "lucrudb", va acorda utilizatorului
"php" toate drepturile in utilizarea acestei baze de date, dupa care va crea tabelul "angajat", cu 6
coloane ("angajatnr", "nume", "ore", "departament", "salariu", "data_angajare") in care vor fi
adaugate trei linii.
Faptul ca limbajul PHP a devenit atat de popular se datoreaza in mare masura faptului ca acesta
contine suport de functii pentru lucrul cu bazele de date.
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
print "Connected to MySQL <br />";
?>
In acest exemplu, serverul MySQL ruleaza pe "localhost" ca si modulul PHP, utilizatorul este
"Marius" iar parola "mypass".
Dupa executia acestui script, daca nu se reuseste conectarea la MySQL, va aparea mesajul
"Unable to connect to MySQL", in caz de reusita, apare mesajul "Connected to MySQL"
n mod prestabilit, functia mysql_connect() se conecteaza la serviciul MySQL prin intermediul
portului 3306, portul MySQL standard. Daca doriti sa obtineti accesul la un server MySQL care
ruleaza pe un port non-standard, puteti atasa un caracter doua puncte si numarul portului dorit la
argumentul care contine numele gazdei; de exemplu, "localhost:3308".
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
print "Connected to MySQL<br />";
mysql_select_db("lucrudb");
if (mysql_error()) {
echo "<br />". mysql_errno(). " : ". mysql_error();
}
?>
Daca se reuseste conexiunea la serverul MySQL si baza de date cu numele "lucrudb" este
inexistenta, rezultatul afisat de exemplul de mai sus va fi urmatorul:
Connected to MySQL
1049 : Unknown database 'lucrudb'
script PHP prin intermediul functiei mysql_query(). Iata un exemplu prin care creem baza de
date "lucrudb":
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$createdb = mysql_query("CREATE DATABASE lucrudb");
if ($createdb)
echo "Baza de date lucrudb a fost creata <br />";
else
echo "<br />". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
- Dupa executarea acestui script, daca totul este corect, va fi creata baza de date "lucrudb" si va fi
afisat mesajul "Baza de date lucrudb a fost creata".
Dupa ce programul a obtinut o conexiune cu serverul MySQL, inainte de a lucra cu tabelele
dintr-o baza de date MySQL, programul trebuie sa selecteze baza de date respectiva. Pentru
aceasta, folositi functia mysql_select_db(), care are urmatoarea forma:
mysql_select_db(baza_de_date)
Unde "baza_de_date" este numele bazei de date la care urmeaza a se obtine acces.
Functia returneaza TRUE daca poate obtine accesul la baza de date, respectiv FALSE n caz
contrar.
Iata un exemplu de selectare a bazei de date "lucrudb":
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if ($selectdb)
echo "Baza de date lucrudb a fost selectata <br />";
else
echo "<br />". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
5. Crearea tabelelor
Dupa conectare si selectarea bazei de date putem crea tabele in cadrul bazei de date selectate.
Pentru aceasta folosim limbajul SQL CREATE TABLE numeTabel (coloana1, coloana2, ...);
impreuna cu functia mysql_query().
In exemplul urmator cream tabelul cu numele "carti" care contine urmatoarele campuri:
Nume camp
id
Tip
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.
<?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
$sql = "INSERT INTO `nume_tabel` (coloana1, coloana2, coloana3)
VALUES
('date1', 'date2', 'date3'),
('valoare1', 'valoare2', 'valoare3'),
('text1', 'text2', 'text3')";
if (mysql_query($sql))
echo 'Datele au fost adaugate';
else
echo "Datele nu au fost adaugate deoarece : ". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
Observati sintaxa de scriere corecta a interogarilor MySQL in PHP, numele tabelului se scrie
intre caracterele ( ` ` ) si valorile intre ghilimele simple ( ' ' )
Dupa ce au fost adaugate mai multe date (randuri) intr-un tabel MySQL, se poate selecta anumite
randuri si coloane cautand dupa un anumit termen sau cuvant. Pentru aceasta se foloseste
comanda WHERE.
- 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'";
'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.
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" />