Sunteți pe pagina 1din 217

PHP

1. Unelte de baza - ce aveti nevoie pentru un site profesionist.


2. Despre PHP - ce este i instruciuni pentru nceptori.
3. Variabile n PHP - ce sunt i cum se folosesc.
4. Variabile predefinite
5. Domeniul de vizibilitate al variabilelor - Cum se pot accesa variabilele.
6. Tipuri de variabile
7. Afiarea mesajelor n PHP
8. Construiete un site cu php
9. Cteva informaii despre documentarea i depanarea unui script.
10. Operatori PHP
11. Cteva idei utile pentru securitatea paginilor web
12. Structuri de control n PHP
13. Despre funcii n PHP
14. Clase i obiecte n PHP
15. Crearea imaginilor thumbnails
16. Autentificarea n paginile restricionate i cteva informaii despre cookie, uploadul
fiierelor i includerea lor n pagini, precum i informaii despre starea conexiunii.
17. Descrierea funciilor care pot fi utilizate la manipularea tablourilor
18. Lucrul cu fiiere i directoare
19. Descrierea funciilor de prelucrare a fiierelor
20. Funcii care faciliteaza lucrul cu directoare
21. Valori scalare i tablouri
22. Lucrul cu formulare
23. Conversia tipurilor de variabile
24. Scrierea instruciunilor swich, break i default
25. Scrierea instruciunilor for
26. Scrierea instruciunilor while i do while
27. Introducere n Clase PHP
28. Sesiuni n PHP
29. Crearea i utilizarea funciilor
30. Utilizarea fiierelor incluse
31. Funcii PHP pentru expresii regulate
32. Utilizarea referinelor n PHP
33. Lucrul cu funcii list
34. Interoperabilitate PHP-Java
35. Transmiterea mesajelor prin e-mail folosind PHP i PEAR
36. Informaii despre clasele ncrcate
37. Prelucrarea dinamic a imaginilor
38. Funcii PHP utilizate pentru accesarea i interogarea bazelor de date MySQL
39. Utilizarea irurilor
40. Manipularea irurilor i scrierea expresiilor regulate
41. Utilizarea variabilelor cookie
42. Expedierea mesajelor de pot electronic
43. Stocarea unor date ierarhice ntr-o baz de date
44. PHP 5, Factory
45. PHP 5, SQLite n Factory?
Unelte de baza - ce aveti nevoie pentru un site profesionist.
De ce s folosii PHP n loc de HTML sau ASP sau PERL? Pentru c, fa de alte limbaje, PHP
este gratuit.
S spunem c avei de fcut un site care va conine peste 150 de pagini. Dac ar fi s l facei
n HTML, ar dura ceva vreme. Ok. S zicem c site-ul este gata, dar acum vrei s schimbai
fontul i culorile textului i ale link-urilor n toate cele 150 de pagini. V apuc durerea de cap
doar cnd v gndii ce avei de fcut. n schimb, n PHP, acest lucru i multe altele sunt foarte
simple. Dac site-ul respectiv ar fi fost fcut n PHP pe module, tot ce ar fi trebuit s facei este
ca n partea care conine informaiile despre text s schimbai informaile despre text i link
aa cum dorii i modificarea este aceeai pentru toate paginile. Simplu nu?
Pentru a rula exemplele i scripturile existente pe acest site pe calculatorul dvs. de acas sau
pe pagina proprie trebuie s avei instalate i configurate cteva aplicaii de care o sa vorbim n
continuare. Nu trebuie s avei cunotine preliminare de baze de date sau programare. Simpla
studiere a codului sursa i aplicarea exemplelor v poate lmurii ce poate face php. Deci, dac
v credei pregtii cititi n continuare...
Unelte de baz
Crearea unor pagini dinamice la un nivel performant, precum i punerea lor n funciune, nu
poate fi fcut fr anumite programe. Iat cam de ce avei nevoie:
Browsere - Pentru testarea paginilor este nevoie de mai multe browsere pentru c nu toate
afieaz acelai rezultat i este neprofesional s obligai vizitatorul s foloseasc un anumit
browser doar pentru c pagina fcut de voi arat i merge mai bine cu acel browser. Deci v
recomand s instalati 2-3 browsere pentru teste. Dintre cele mai folosite n prezent v
recomand Internet Explorer (folosit pe calculatoare cu sistem de operare Windows), Firefox (se
foloseste din ce n ce mai des datorit extensiilor i faptului c se poate instala att pe sisteme
de operare Windows ct i pe Mac OS X sau Linux) i Opera (care are suport pentru mai multe
sisteme de operare).
Serverul web pentru teste - Dac lucrai cu PHP-MySQL sub Windows, sigur avei nevoie de
triada Apache - PHP - MySQL s fie instalat pe calculatorul local. Pentru aceasta avei dou
posibiliti: prima ar fi s descrcai de pe pagina productorului fiecare aplicaie n parte i s
o instalai manual, urmnd apoi s facei configurarea serverelor manual (lucru nerecomandat
nceptorilor) i a doua variant s descrcai un program care instaleaz toate acestea gata
configurate pe calculator, urmnd ca voi doar s v apucai de lucru. Astfel de aplicaii sunt
EasyPHP de exemplu (pentru Windows 95-98 dar merge i pe Windows 2000 i XP) sau
recomandarea mea WAMP5 care merge doar pe Windows NT (adica 2000, XP, 2003, Longhorn,
etc) dar care are multe alte faciliti n plus fa de EasyPHP pe care cu timpul cnd vei nva
mai multe despre PHP si MySQL o s le considerai foarte utile (cum ar fi posibilitatea de
testare a scripturilor PHP att pentru versiunea 4 ct si 5). Ultima recomandare, att pentru cei
care folosesc sistemul de operare Windows ct i Linux, ar fi XAMP care conine toate pachetele
necesare instalrii i configurrii unui server de web profesional (inclusiv server de FTP, SSI,
DNS i MAIL), dar pe care nu l recomand nceptorilor pentru c mulimea de faciliti oferite
v poate ncurca.
Editoare web - Dup ce ai instalat serverul web i browserele acum v mai trebuie un editor
bun pentru a scrie cod i a vizualiza paginile create. Pentru aceasta recomandarea mea este
suita Macromedia (Dreamweaver, FLASH i FreeHAND). Putei descrca Dreamweaver (pentru
a scrie cod i a vedea/rula paginile n timp real) de la ei de pe site i tot de la ei v mai
recomand Fireworks (dac v ocupai i cu design-ul paginilor aceasta aplicaie v este util
mpreun cu Adobe Photosop sau Corel Draw) i Flash (dac dorii s facei animaie pentru
site). Desigur sunt o mulime de programe care fac aceleai lucruri cu ce v recomand eu, dar
dac dorii s lucrai la nivel profesional recomand s lucrai cu unelte de profesioniti.
Bineneles c putei scrie cod i n Notepad i desena n Paint dar aplicaiile pe care vi le-am
recomandat v uureaz extraordinar de mult munca i v semnaleaz rapid erorile din pagini.
Alte editoare pe care vi le recomand s le testai sunt: PSPad (un bun nlocuitor al Notepad-
ului, mai ales c este freeware), Zend Studio (destinat profesionitilor).
Dup ce ai fcut rost de tot ce v trebuie ca s ncepei treaba, v recomand s citii n
continuare celelalte articole, eventual s vizitai i pagina de download, sigur gsii ceva util
acolo pentru nceput, apoi pagina de link-uri, unde gsiti resurse gratuite i s discutm pe
forum eventualele probleme pe care le ntmpinai.
Despre PHP - ce este i instruciuni pentru nceptori.
Despre PHP
PHP este limbajul ideal pentru construirea de pagini web dinamice. Este usor de nvat, open-
source, poate fi rulat pe mai multe platforme i se poate conecta la mai multe tipuri de baze de
date. Cel mai important aspect al limbajului este nsa posibilitatea de a fi mbricat cu cod
HTML. Putem astfel crea pagini HTML statice i din loc n loc, acolo unde este nevoie, s
introducem dinamism cu ajutorul PHP.
Limbajul PHP s-a "nscut" n 1994 din nevoia lui Rasmus Lerdorf de a afla cte persoane i
viziteaz CV-ul online. El a denumit setul de scripturi create PHP, acronimul pentru Personal
Home Page. Pe parcursul urmtorilor trei ani limbajul a evoluat dar adevratul succes a nceput
s l cunoasc de cnd Zeev Suraski si Andi Gutmans au rescris motorul PHP de la cap la
coad, motor care poart din versiunea 4 a PHP numele Zend, o combinaie de litere din
prenumele creatorilor si: Zeev i Andi.
Fiind open-source, PHP beneficiaz de suport activ din partea comunitii online, acesta fiind i
motivul creterii explozive a numrului site-urilor bazate pe PHP.
Interpretorul PHP este cel mai cunoscut limbaj de scripting folosit n acest moment pentru
crearea site-urilor Web interactive. Denumirea este un "acronim recursiv" pentru Hypertext
PreProcessor. Diferena esenial fa de alte limbaje de scripting (gen JavaScript) este faptul
c PHP este un interpretor server-side (operaiile sunt executate de ctre server i nu pe
calculatorul utilizatorului). Pentru a putea testa pagini PHP avei nevoie de un server de web
(Apache) i de pachetul PHP instalat.
PHP permite folosirea unor elemente specifice limbajelor de programare. Ieirea standard a
script-ului PHP devine intrarea standard pentru programul de navigare care vizualizeaz
pagina. Aadar, la iesirea standard poate fi scris (de exemplu, prin intermediul comenzii echo)
orice tip de cod HTML, acesta fiind interpretat de ctre browser.
Pe lng manipularea coninutului paginilor de web, PHP poate trimite headere HTTP pentru
autentificare, seta cookie-uri sau redireciona utilizatorii. Mai mult, cu ajutorul bibliotecilor
externe de funcii poate parsa fisiere XML, crea i manipula imagini, animaii Shokwave Flash,
PDF-uri sau se poate conecta la un server de mail, iar acestea sunt doar cteva din funciile pe
care le poate ndeplini.
Interpretorul PHP parcurge documentul accesat pn n momentul n care ntlnete un marcaj
de deschidere care indic faptul c textul care urmeaz trebuie interpretat ca fiind cod PHP. n
continuare, textul este interpretat ca fiind cod PHP pn n momentul n care este ntlnit
marcajul de inchidere. ntreg textul care nu este interpretat ca fiind cod PHP este furnizat la
iesire n forma n care a fost primit ca intrare de catre interpretor. Exist mai multe marcaje
care indic nceperea unei secvene de cod PHP, dar doar dou dintre ele sunt folosite de obicei
(aceste marcaje depind i de configurarea serverului de web). Dac dorim ca documentul s
respecte specificaiile XML, atunci singura posibilitate de inserare a codului PHP este folosirea
unei secvente de tipul:
Cod:
<?php
//cod PHP
?>
Cea de-a doua posibilitate este utilizarea marcajului <SCRIPT> ntr-o maniera asemntoare
celei folosite pentru includerea de script-uri JavaScript. Sintaxa este urmatoarea:
Cod:
<SCRIPT language = "php">
//cod PHP
</SCRIPT>
Exist alte dou posibiliti, dar acestea sunt folosite rar, n situaii particulare i depinde n
mare msur de setrile serverului de web.
Este permis "iesirea" i "intrarea" n "modul PHP" de oricte ori este necesar n pagin.
Aceasta este util cnd se lucreaz cu texte de mari dimensiuni.
Pentru ca instruciunile PHP s fie interpretate corect, acestea trebuie separate prin caracterul
';'.
n PHP, comentariile pot fi inserate folosind sintaxele din C, C++ i shell-urile Unix. Apariia
secventei de caractere '//' sau a caracterului '#' indic faptul c restul liniei reprezint un
comentariu. Pentru a insera comentarii pe mai multe linii, acestea trebuie delimitate de
secventa '/*' la nceput i de secventa '*/' la sfrit.
Variabile n PHP - ce sunt i cum se folosesc.
Variabile n PHP
Programarea de orice fel, nu doar PHP, are dou elemente de baz: datele i instruciunile.
Pentru a lucra cu datele trebuie s nelegem ce sunt variabilele i tipurile, iar pentru a lucra cu
instruciuni trebuie s aflm ce sunt structurile de control i funciile.
O variabil este o zon de memorie cruia i se d un nume pentru a putea fi recunoscut
ulterior i pentru a ne putea referi mai trziu la ea.
n PHP, o variabil este reprezentat de semnul '$', urmat de numele variabilei. La fel ca n
limbajele C/C++ sau Java, pentru denumirea variabilelor se face distincia ntre literele mari i
literele mici.
Numele unei variabile poate ncepe cu o liniu de subliniere '_' sau o liter. Restul caracterelor
care formeaz numele variabilei pot fi litere, cifre sau liniue de subliniere. n PHP, sunt
considerate litere toate caracterele cuprinse ntre 'a' i 'z', cele cuprinse ntre 'A' i 'Z', precum
i cele care au codul ASCII cuprins ntre 127 i 255.
ncepnd cu versiunea 4, au fost introduse referinele; astfel, o variabil poate referi o alta,
astfel nct modificarea valorii uneia duce la modificarea automat a valorii celeilalte. O
referin la o variabil este reprezentat de caracterul '&'. Iat un scurt exemplu:
Cod:
<?php
$a = "PHP4 e slab";
$b = &$a;
$b = "PHP4 e foarte bun";
echo $a;
echo "<br>";
echo $b;
?>
Dup cum se vede, modificarea valorii variabilei $b a dus automat la modificarea automat a
valorii variabilei $a.
S disecm codul pentru a nva cteva lucruri:
- toate instruciunile PHP se termin cu punct i virgul. Omiterea semnului ";" este cea mai
frecvent greeal pe care o fac programatorii nceptori.
- codul PHP ncepe ntotdeauna cu "<?php" i se termin cu "?>". El poate fi mbricat cu cod
HTML dup cum putei vedea n exemplul de mai sus. Putei chiar crea pagini HTML fr pic de
cod PHP n ele i s le dai extensia php. Atta vreme ct parser-ul PHP nu "vede" tagurile "<?
php ...?> ", el va trimite pagina neschimbat ctre server.
- putem pune diacritice n cadrul unui string ns pentru ca browserul s le afieze corect va
trebui s specificm n <head> setul de caractere folosit, la fel ca ntr-un document HTML.
- valoarea unei variabile poate fi schimbat dup necesiti (aa cum am schimbat valoarea lui
$a) sau ea va fi schimbat automat n funcie de celelalte variabile de care depinde.
Variabile predefinite
ncepand de la versiunea 4.1.0 metodele predefinite pentru preluarea variabilelor externe
depind de setarea din php.ini a variabilelor globale (register_globals). Astfel dac pe server
este setat register_globals=ON (nerecomandat) se pot prelua de exemplu variabilele trimise
prin GET i POST apelnd direct variabila.
Exemplu:
Cod:
<?php
// sa spunem ca avem un formular in care exita un camp numit "camp1" si
care se trimite prin metoda POST:
// cu register_globals=ON
$camp1 = "valoarea campului";
// cu register_globals=OFF
$_POST['camp1'] = "valoarea campului";
$camp1 = $_POST['camp1'];
?>
Variabile globale:
$GLOBALS - pot fi accesate toate variabilele globale care sunt accesibile script-ului PHP
curent; acest vector este indexat chiar prin numele variabilelor globale. Aceast variabil
superglobal este accesibil ncepnd cu versiunea 3.0.0
$_SERVER - conine o serie de variabile ale cror valori sunt setate de server-ul web;
majoritatea valorilor variabilelor din acest vector depind de mediul de execuie al script-ului
curent. A fost introdus ncepnd de la versiunea 4.1.0. n versiunile anterioare se folosea
$HTTP_SERVER_VAR .
Este o variabil care conine informaii cum ar fi headere, locaia scriptului, sau informaii
despre vizitator i browser. Este posibil ca n funcie de setrile fiecrui server i browser s nu
fie active toate informaiile specificate de aceast variabil. Aceast variabil este de
asemenea global, adic se poate folosi oriunde n script, fr apelarea ei ca funcie global
(adic nu trebuie s o cerei cu global $_SERVER n funciile dvs.) n schimb
$HTTP_SERVER_VARS conine aceleai informaii dar nu este o funcie global (atenie
$HTTP_SERVER_VARSi $_SERVER sunt dou variabile diferite, chiar dac aparent fac
aceleai lucruri) Dac directiva register_globals este ON atunci aceste variabile vor deveni la
rndul lor variabile globale n cadrul scriptului.
Elementele acestor variabile sunt cele de mai jos (atenie: n funcie de setrile serverului i
browserului unele elemente pot lipsi)
' PHP_SELF ' - conine numele fiierului unde se execut scriptul curent, relativ la rdacin
(document root) De exemplu, $_SERVER['PHP_SELF' ntr-un script la adresa
http!""e#a$ple.%o$"test.php"&oo.bar va fi "test.php"&oo.bar . Constanta __FILE__ conine
toat calea i numele fiierului curent.
' argv ' - Un array al argumentului trimis ctre script. Cnd scriptul ruleaz n linie de
comand, va da acces C-style la parametrii liniei de comanda. Cnd este accesat prin metoda
GET, acesta va conine un sir de interogare.
' argc ' - Conine un numr al parametrilor liniei de comand trimise ctre script (daca este
rulat n linie de comanda).
' GATEWAY_INTERFACE ' - Returneaza versiunea CGI utilizat pe server (exemplu ' CGI/1.1
').
' SERVER_NAME ' - Numele server-ului de hosting unde se execut scriptul curent. Dac
scriptul ruleaz pe un host virtual, aceasta va conine valoarea definit pentru acel host
virtual.
' SERVER_SOFTWARE ' - Returneaz un ir de identificare al server-ului dat n header ca
raspuns la cerere.
' SERVER_PROTOCOL ' - Numele i versiunea protocolului prin care este cerut pagina
(exemplu ' HTTP/1.0 ')
' REQUEST_METHOD ' - returneaz metoda utilizat pentru accesarea paginii (exemplu ' GET
', ' HEAD ', ' POST ', ' PUT ')
' REQUEST_TIME ' - Valoarea ti$esta$p dat la pornirea cererii. Este valabil ncepnd de la
versiunea PHP 5.1.0.
' QUERY_STRING ' - Sirul de interogare, dac este, de la pagina care a fost accesat.
' DOCUMENT_ROOT ' - Directorul radcin unde este rulat scriptul curent, aa cum este
definit n fiierul de configuraie al serverului.
' HTTP_ACCEPT ' - Coninutul header-ului acceptat de la cererea curent, dac este unul.
' HTTP_ACCEPT_CHARSET ' - Conine setul de caractere acceptate i care este trimis de
header-ul cererii respective, dac exist. Exemplu: ' iso-8859-1,*,utf-8 '.
' HTTP_ACCEPT_ENCODING ' - Conine tipul de encodare trimis de cerera curent prin
header, dac exist.. Exemplu: ' gzip '.
' HTTP_ACCEPT_LANGUAGE ' - Conine limbajul trimis de cererea curent prin header, dac
exista. Exemplu: ' en '.
' HTTP_CONNECTION ' - Conine informaii despre conecsiiunea trimis de cererea curent
prin header, dac exist. Exemplu: ' Keep-Alive '.
' HTTP_HOST ' - Conine informaii despre host, header-ul de la cererea curent, dac exist.
' HTTP_REFERER ' - Adresa paginii (dac este) de unde a venit userul n pagina curent.
Aceasta este setat de ctre browser. Nu toate browserele seteaz aceast valoare, i chiar
unele au posibilitatea de a modifica HTTP_REFERER aa cum vor. Pe scurt, nu este de
ncredere.
' HTTP_USER_AGENT ' - Conine semntura browser-ului trimis prin header la cererea
curent, dac exist. Un exemplu tipic este: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586) . n
afar de asta, putei utiliza get_browser() pentru a vedea ce capabilitai are browserul
folosit de user i astfel s returnai pagina specific pentru acel browser.
' HTTPS ' - Seteaz o valoare dac scriptul a fost cerut printr-un protocol securizat HTTPS
' REMOTE_ADDR ' - Adresa de IP a userului care acceseaz pagina curent.
' REMOTE_HOST ' - Numele hostului userului care vede pagina curent. Este inversul DNS-
ului userului bazat pe RE'OTE_A((R. Atenie: Serverul web trebuie configurat pentru a crea
aceast variabila. De exemplu n Apache va trebui Hostna$eLoo)*ps On n fiierul de
configurare http,.%on&. Pentru alte detalii vedei i funcia gethostbyaddr() .
' REMOTE_PORT ' - Portul prin care userul comunic cu serverul web.
' SCRIPT_FILENAME ' - Calea absolut unde se execut scriptul curent. Atenie: Dac
scriptul este rulat cu CLI, ca i cale relativ, cum ar fi file.php sau ../file.php ,
$_SERVER['SCRIPT_FILENAME'] va conine calea relativ specificat de ctre user.
' SERVER_ADMIN ' - Valoarea dat de directiva SERVER_A('-N (pentru Apache) n fiierul
de configurare al web serverului. Dac scriptul ruleaz pe un host virtual, acesta va conine
valoarea definit pentru acel host virtual.
' SERVER_PORT ' - Portul de pe server care este folosit pentru comunicare pe web. Pentru
setrile standard, acesta este ' 80 '; pentru SSL, de exemplu, se va schimba cu oricare port
definit n transmisia securizat HTTP.
' SERVER_SIGNATURE ' - Conine un ir care cuprinde versiunea serverului i numele
hostului virtual dac este.
' PATH_TRANSLATED ' - Calea de baz a sistemul de fiiere (nu rdacina documentului) de
la scriptul curent, dup ce serverul a terminat maparea oricror cai ( virtual-to-real mapping)
Atenie: ncepnd de la PHP 4.3.2, PATH_TRANSLATED nu mai este setat implicit n Apache
2 SAPI n contrast cu situaia din Apache 1, unde este setat aceeai valoare ca i la
SCRIPT_FILENAME. Aceast schimbare a fost fcut pentru a fi compatibil cu specificaiile
CGI n care PATH_TRANSLATED trebuie s existe doar dac PATH_INFO este definit.
Utilizatorii Apache 2 pot utiliza A%%eptPath-n&o = On n fiierul de configuraie http,.%on&
pentru a defini PATH_INFO .
' SCRIPT_NAME ' - Conine calea ctre scriptul curent. Acesta este util pentru pagini care
trebuiesc definite ctre ele nsui. Constanta __FILE__ conine calea complet i numele de
fiier al scriptului curent.
' REQUEST_URI ' - URI care este dat pentru accesarea paginii curente, de exemplu '
/index.html '.
' PHP_AUTH_DIGEST ' - Cnd rulai sub Apache ca modul, aciunea (igest HTTP. valoarea
acestei variabile este setat n 'Authorization' header trimis ctre client (care ar trebui utilizat
pentru a face o validare corespunztoare).
' PHP_AUTH_USER ' - Cnd este rulat sub Apache sau IIS (ISAPI pe PHP 5) ca modul,
actiunea HTTP a*thenti%ation, aceast variabil conine numele userului trimis de ctre user.
' PHP_AUTH_PW ' - Cnd este rulat sub Apache sau IIS (ISAPI pe PHP 5) ca modul, actiunea
HTTP a*thenti%ation, aceast variabil conine parola userului trimis de ctre user.
' AUTH_TYPE ' - Cnd este rulat sub Apache ca modul aciunea HTTP a*thenti%ate, , aceast
variabil seteaza tipul de autentificare.
Variabilele pentru trimiterea datelor:
$_GET este o variabil array global. A fost introdus n versiunea 4.1.0. Pentru versiunile
anterioare se folosete $HTTP_GET_VARS care nu este variabil global. Putei folosi $_GET
pentru a trimite variabile cu valori prin intermediul linkurilor.
$_POST este de asemenea o variabil array global. A fost introdusa n versiunea 4.1.0.
Pentru versiunile anterioare se folosete $HTTP_POST_VARS care nu este variabil global.
Putei folosi $_POST pentru a trimite variabile cu valori prin intermediul formularelor.
$_GETi $_POST conin variabile primite de script prin intermediul unor transferuri care
folosesc metodele HTTP get, respectiv post. De exemplu, prin intermediul acestor vectori pot fi
accesate valorile cmpurilor dintr-un formular care a fost completat i transmis folosind una
dintre cele doua metode.
Variabilele HTTP coockies:
$_COOKIE conine valorile variabilelor care conin informaii referitoare la cookie-urile
pstrate pe calculatorul utilizatorului care acceseaz pagina web. A fost introdus n versiunea
4.1.0. n versiunile anterioare, utilizai $HTTP_COOKIE_VARS .
Variabile pentru uploadul fisierelor:
$_FILES conine variabile primite de script prin intermediul ncrcrilor de fiiere prin metoda
post. A fost introdus n versiunea 4.1.0. n versiunile anterioare se folosete
$HTTP_POST_FILES care nu este variabil global.
Variabilele de mediu $_ENV
$_ENV conine variabile disponibile prin intermediul mediului n care este executat. A fost
introdus n versiunea 4.1.0. n versiunile anterioare, utilizai $HTTP_ENV_VARS .
Variabilele pentru cereri:
$_REQUEST conine variabile disponibile prin intermediul oricrui tip de mecanism cu ajutorul
cruia utilizatorul poate introduce date. Este de tip array i conine valorile variabilelor
$_GET , $_POST , i $_COOKIE. A fost introdus n versiunea 4.1.0. ncepnd de la
versiunea 4.3.0, informaiile din $_FILES au fost de asemenea incluse n $_REQUEST
Variabile de sesiune:
$_SESSION conine variabile care corespund sesiunii curente a script-ului, sub form de array.
A fost introdus n versiunea 4.1.0 i este de asemenea global. n versiunile anterioare
folosii $HTTP_SESSION_VARS.
Variabile de mesaje de eroare:
$php_errormsg - este o variabil ce conine ultimul mesaj generat de ctre PHP Aceast
variabil este folosit n scopul de a vedea ce eroare apare i doar dac opiunile de
configurare a erorilor track_errors este pornita (standard este pe OFF)
Constante predefinite:
PHP conine un mare numr de constante predefinite pentru fiecare script care ruleaz. Totui,
sunt 5 constante "magice" pe care le prezint n continuare:
__LINE__ - Conine numrul curent al liniei din fisier.
__FILE__ - toat calea i numele fiierului curent. Dac este folosit n interiorul unui fiier
inclus, va returna numele fiierului inclus. ncepnd de la versiunea 4.0.2 conine ntotdeauna
calea absolut la fiier, pe cnd n versiunile anterioare conine calea relativ, n afar de
cteva cazuri.
__FUNCTION__ - Numele funciei (adugat n versiunea 4.3.0) n PHP 5 aceast constant
returneaz numele funciei care a fost declarat (case-sensitive). n PHP 4 aceast valoare
este ntotdeauna lowercased (cu litere mici)
__CLASS__ - Numele clasei (adaugat n versiunea 4.3.0) n PHP 5 aceast constant
returneaz numele clasei care a fost declarat (case-sensitive). n PHP 4 aceast valoare este
ntotdeauna lowercased (cu litere mici)
__METHOD__ - Numele metodei clasei (adaugat n versiunea 5.0.0.) Numele metodei este
returnat asa cum este declarat (case-sensitive)
Domeniul de vizibilitate al variabilelor - Cum se pot accesa variabilele.
n PHP o variabil poate fi accesat doar n contextul n care a fost definit. De exemplu, o
variabil definit n interiorul unei funcii nu va putea fi accesat dect de instruciunile din
interiorul acelei funcii. Mai mult, n mod implicit, o variabil definit n exteriorul unei funcii
nu va putea fi accesat n interiorul funciei chiar dac ea nu este redefinit n cadrul funciei.
Pentru ca o funcie s aib acces la o variabil definit n afara ei, variabila trebuie redeclarat
ca variabil global n interiorul funciei.
S considerm urmtorul exemplu:
Cod:
<?php
$a = 1;
function test ()
{
echo $a;
}
test ();
?>
Observm c nu se afieaz valoarea 1 deoarece instruciunea e%ho $a se refer la variabila
local $a care nu este definit, deci nu are nici o valoare. n continuare, este o versiune n
care instruciunea e%ho $a va accesa variabila $a definit n afara funciei test/0:
Cod:
<?php
$a = 1;
function test ()
{
global $a;
echo $a;
}
test ();
?>
O a doua posibilitate de a accesa o variabil definit n afara funciei este folosirea vectorului
$1LO2ALS:
Cod:
<?php
$a = 1;
function test ()
{
echo $GLOBALS ["a"];
}
test ();
?>
Tipuri de variabile
Variabilele pot fi de mai multe tipuri, nu doar numere. PHP are opt tipuri de variabile. Patru
dintre acestea sunt tipuri scalare (boolean. integer. &loat i string), dou sunt tipuri compuse
(arra3 i ob4e%t), iar alte dou sunt tipuri speciale (reso*r%e i n*ll). De asemenea, din motive
de lizibilitate, au fost introduse trei pseudotipuri: $i#e,. n*$ber i %allba%). Mai exista i tipul
,o*ble, dar semnificaia acestuia este aceeai cu cea a tipului &loat. Cele dou denumiri
coexist doar din motive "istorice". n PHP, de obicei, tipul unei variabile nu este specificat de
ctre programator, ci este stabilit n timpul execuiei n funcie de contextul n care este
folosit variabila.
Tipul boolean: Variabilele de acest tip pot avea doar dou valori: A(EVARAT sau FALS.
Aceste valori pot fi indicate prin cuvintele cheie TR5E sau FALSE (pentru ambele nu se face
distincie ntre literele mari i literele mici). Exist posibilitatea de a converti o variabil de
orice tip la tipul boolean. n momentul efecturii unei conversii, sunt convertite la valoarea
FALSE urmtoarele valori:
- numrul ntreg 0;
- numrul real 0.0;
- sirul vid;
- sirul "0";
- un vector fr nici un element;
- un obiect fr nici o variabil membru;
- o variabil de tipul N5LL;
- o variabil nedefinit.
Orice alt valoare este convertit la valoarea TR5E (inclusiv resursele).
Acest tip se poate folosi de exemplu pentru verificarea logrii ntr-o pagin de administrare.
Dup ce se fac verificrile, dac utilizatorul este logat ca administrator, funcia noastr va
returna o valoare de adevar: TRUE dac este logat, sau FALSE dac nu este, i astfel vom ti
dac s i acordm sau nu acces n seciunea de administrare.
Tipul integer: O variabil de tip integer reprezint o valoare din mulimea numerelor ntregi.
Aceste numere pot fi specificate n baza 10, n baza 16 sau n baza 8, conveniile fiind aceleai
ca i n limbajele C/C++ sau Java. Modul de reprezentare depinde de platforma utilizat; de
obicei se folosete reprezentarea pe 32 de biti. Interpretorul PHP nu ofer suport pentru
numerele ntregi far semn. Trebuie remarcat faptul c n PHP nu exist nici un operator
pentru efectuarea de mpriri ntregi. De exemplu, rezultatul operaiei 3/2 nu va fi numrul
ntreg 1 (ca n C/C++ sau Java), ci numrul real (&loat) 1.5
i pentru numerele ntregi exist posibilitatea efecturii de conversii:
- valoarea logic TR5E este convertit la valoarea ntreag 1;
- valoarea logic FALSE este convertit la valoarea ntreag 0;
- un numr real este convertit prin "rotunjire nspre 0"; asadar, valoarea real 2.5 va fi
convertit la valoarea ntreag 2, n timp ce valoarea real -2.5 va fi convertit la valoarea
ntreag -2;
- un sir de caractere este convertit lund n considerare doar primele caractere care conin
informaii numerice; aadar irul "10" va fi convertit la valoarea ntreag 10; de asemenea
irul "10 ani" va fi convertit tot la valoarea 10; dac primele caractere nu conin informaii
numerice, rezultatul conversiei va fi valoarea 0.
Tipul float: O variabil de tip &loat poate fi specificat folosind fie forma zecimala, fie cea
tiinific (cu exponent). La fel ca i n cazul tipului integer, precizia variabilelor de tipul float
este dependent de platforma utilizat. De obicei se folosete standardul IEEE 64. Exist
posibilitatea de a converti o variabil de orice tip la tipul &loat. Pentru numerele reale se pot
efectua urmtoarele conversii:
- un ir de caractere este convertit lund n considerare doar primele caractere care conin
informaii numerice; aadar irul "10.2" va fi convertit la valoarea real 10.2; irul "1.23E1
ani" va fi convertit la valoarea 12.3;
- n toate celelalte cazuri se realizeaz conversii la numere ntregi care apoi sunt convertite la
valorile reale corespunztoare.
Tipul string: O variabil de tip string reprezint un ir de caractere. Un caracter se reprezint
pe un octet, deci sunt 256 de caractere distincte. Acest lucru implic faptul c interpretorul
PHP nu ofer suport nativ pentru setul de caractere 5ni%o,e. Lungimea variabilelor de tip
string nu este limitat de ctre interpretor. Literalii de tip ir de caractere pot fi specificai n
trei moduri diferite:
- prin folosirea ghilimelelor simple (exemplu $a='acesta este un sir de caractere'). Pentru a
avea n cadrul irului simbolul "`", atunci naintea acestuia trebuie scris caracterul "\", iar
pentru a putea specifica simbolul "\" acesta trebuie dublat.
- prin folosirea ghilimelelor duble. Folosind aceast notaie pot fi specificate mai multe
caractere speciale, pe lng caracterele de la varianta anterioara, printre care: sfrit de linie
("\r"), rnd nou ("\n"), tab orizontal ("\t"), semnul dolar ("\$"), ghilimelele duble ("\""),
secvene de caractere pentru specificarea faptului c o expresie regular este n notaie octal
("\[0-7]{1,3}") i secvenele de caractere pentru specificarea faptului c o expresie regular
este n notaie hexazecimal ("\x[0-9A-Fa-f]{1,2}"). Cel mai important lucru este acela c,
folosind acest mod de specificare a literalilor de acest tip, numerele de variabile care apar n
interior vor fi transformate n valoarea lor. De exemplu dac $a este o variabil de tipul
integer i are valoarea 2, atunci sirul de caractere "Variabila a are valoarea $a." va fi
transformat n irul "Variabila a are valoarea 2".
- notaia here,o%. Acest tip de notaie a fost introdus la versiunea 4 a interpretorului PHP.
Pentru a specifica un sir de caractere folosind aceast notaie trebuie utilizat operatorul "<<<"
urmat de un identificator ales de utilizator. Toate caracterele care se afl ntre operatorul
"<<<" urmat de un identificator pe o singur linie, i acelai identificator pe o alt linie vor
constitui valoarea sirului de caractere. De exemplu, instruciunea:
Cod:
$str=<<<SF
Acesta este un exemplu
de utilizare a sintaxei
heredoc
SF;
va avea ca rezultat un ir de caractere format din trei linii de text.
Pentru a accesa un anumit caracter din irul de caractere se folosete, dup numele variabilei
de tip string, indicile caracterului care trebuie accesat scris ntre acolade. De exemplu, $str{0}
returneaz primul caracter din irul de caractere $str.
n cazul n care dorim s concaternm dou iruri de caractere vom folosi operatorul "."
Folosirea operatorului "+" nu va concaterna cele dou iruri.
Exist posibilitatea de a converti o variabil de orice tip la tipul string. Pentru irurile de
caractere se pot efectua urmtoarele conversii:
- valoarea logic TRUE va fi convertit la irul "1", iar valoarea logic FALSE va fi convertit la
irul vid ("");
- un numr ntreg va fi convertit la un ir de caractere care reprezint valoarea numrului n
baza 10;
- un numr real va fi convertit la un ir de caractere care reprezint notaia tiinific a
acestuia;
- obiectele sunt ntotdeauna convertite la irul "Ob4e%t";
- variabilele de tipul reso*r%e sunt convertite la irul "Reso*r%e i, 6n", unde n reprezint un
numr unic ataat resursei respective de ctre interpretorul PHP;
- valoarea N5LL este convertit la irul vid ("").
Tipul array - Vectorii n PHP sunt nite mulimi formate din %hei. Fiecarei chei din vector i se
ataeaz o valoare. Acest tip de date este optimizat astfel nct s poat fi folosit n locul
urmtoarelor structuri de date: liste, tabele de dispersie, dicionare, colecii, stive, cozi i
altele. Datorit faptului c o valoare poate fi reprezentat de un alt vector, se pot simula
foarte uor arborii n-dimensionali sau tablourile n-dimensionale. Valoarea unei variabile de tip
vector se poate specifica folosind construcia
array (cheie => valoare, cheie => valoare, ...)
De exemplu, urmtoarea nstruciune PHP va construi un vector cu dou elemente, dintre care
unul este de tip string, iar cellalt de tip boolean:
$a = array ("ch" => "string", 12 => TRUE);
Variabila $a reprezinta un vector, $a ["ch"] are valoarea string, iar $a [12] are valoarea TR5E.
n cazul n care nu se specific o cheie pentru o valoare, atunci acea valoare va fi ataat unei
chei care va fi cheia maxim de tip integer folosit anterior, la care se adaug valoarea 1.
Cheile pot avea i valori negative. Dac nu exist chei de tip integer, atunci valoarea va fi
ataata cheii 0. De exemplu, urmtoarele dou instruciuni sunt echivalente:
array (5 => 43, 32, 56, "b" => 12);
array (5 => 43, 6 => 32, 7 => 56, "b" => 12);
Dac se folosete valoarea logic TR5E ca i cheie, atunci aceasta va fi convertit la cheia de
tip ntreg 1, iar valoarea FALSE va fi convertit la numrul ntreg 0. Nu se pot folosi pentru
chei variabile de tipul arra3 sau ob4e%t.
O variabil de tip array se poate modifica prin setarea explicit de valori. De exemplu
instruciunea $a ["x"] = 42; adaug n vectorul $a valoarea 42 ataat cheii "x". Dac se
folosete un vector care nu a fost definit anterior, atunci acesta este creat automat. Aadar
printr-o instruciune de forma $a [5] = 42, n cazul n care vectorul $a nu exist, atunci se va
crea un vector cu un singur element. Cheia acestuia va fi numrul ntreg 5, iar valoarea sa va
fi 42.
De asemenea, exist posibilitatea de a crea un element nou fr a-i preciza cheia. Sintaxa are
forma $vector [] = valoare; aceast instruciune are ca efect adugarea unui element a crui
cheie este un numar ntreg mai mare cu 1 dect cel mai mare numr ntreg care este cheie a
unui alt element al vectorului. Dac nu exist nici o astfel de cheie, atunci noul element va
avea cheia 0. De exemplu, urmtoarele dou secvente sunt echivalente:
$a [5] = 1; ............................ $a [5] = 1;
$a [6] = 2; ............................ $a [] = 2;
Prin conversia la un vector a unei variabile de tip scalar /boolean. integer. &loat. string) sau
reso*r%e se creeaz un vector cu un singur element; cheia acestui element este numrul
ntreg 0, iar valoarea este cea a variabilei convertite.
Dac se convertete un obiect (variabila de tip ob4e%t), atunci vectorul rezultat va conine cte
un element pentru fiecare variabil membru a obiectului. Cheile elementelor vor fi date de
denumirile proprietilor obiectului (variabilele membru ale obiectului), iar valorile elementelor
vor fi valorile proprietilor obiectului.
Dac realizm o conversie a unei variabile de tip NULL, atunci rezultatul va fi un vector vid
(care nu conine nici un element).
n continuare sunt prezentate cteva exemple care descriu mai detaliat posibilitile oferite de
folosirea vectorilor n PHP. Pentru nceput, prezint un vector al crui elemente reprezint
caracteristicile unei portocale:
Cod:
$a = array ('denumire' => 'portocala',
'familie' => 'citrice',
'culoare' => 'portocaliu',
'forma' => 'rotunda',
'ust' => 'dulce'
!;
Putem aduga i alte elemente care s reprezinte diferite alte proprieti. De exemplu, am
putea avea nevoie de o valoare suplimentar creia nu dorim s i atribuim nici un nume de
identificare (cheie). Pentru ca vectorul s conina un element suplimentar cu valoarea 4, vom
putea defini vectorul astfel:
Cod:
$a = array ('denumire' => 'portocala',
'familie' => 'citrice',
'culoare' => 'portocaliu',
'forma' => 'rotunda',
'ust' => 'dulce',
"!;
Cheia elementului cu valoarea 4 va fi numrul ntreg 0 deoarece nu exist nici o alt cheie
care este numr ntreg. O alternativ de construire a acestui vector este urmtoarea:
Cod:
$#$'denumire'% = 'portocala';
$#$'familie'% = 'citrice';
$#$'culoare'% = 'portocaliu';
$#$'forma'% = 'rotunda';
$#$'ust'% = 'dulce';
$#$% = ";
Exemplul urmtor ilustreaz cum putei folosi vectorii la afiarea unei pagini cu text colorat:
Cod:
$colors = array (`red`,
`green`,
`blue`,
`silver` );
foreach ($colors as $color)
{
echo "<FONT size = 4 color = $color>";
echo "<b>Acest text este <i>$color!</i>";
echo "</b></FONT><br>";
}
Tipul object: Pentru a defini un obiect care poate fi folosit pentru afiarea mesajului
SAL5TARE L5'E7 se scrie urmtoarea secven:
Cod:
class salutare
{
function Displaysalutare ()
{
echo "SALUTARE LUME!";
}
}
Pentru a utiliza o variabil de tip obiect va trebui s realizm o instan8iere prin intermediul
instruciunii ne9. Sintaxa este:
$a = new salutare;
Astfel, variabila $a devine un obiect ale crui metode pot fi utilizate. Pentru afiarea propriu-
zis a mesajului va trebui s executm metoda (ispla3sal*tare/0 printr-o instruciune de tipul
$a -> Displaysalutare();
Orice variabil de un anumit tip poate fi convertit ntr-un obiect. Dac variabila respectiv
este un obiect, atunci ea nu va fi modificat. n caz contrar, efectul conversiei este crearea
unei noi instane a clasei st,:lass. Dac variabila are tipul N5LL, atunci noua instan va fi
vid. n toate celelalte cazuri instana va conine o variabil membru numit s%alar a crei
valoare va fi cea a variabilei convertite. Pentru conversii vom folosi instruciuni de tipul
$obiect = (object) "SALUTARE LUME!"
Dup realizarea conversiei vom putea tipri mesajul SALUTARE LUME! folosind instruciunea
echo $obiect->scalar;
Tipul resource: Variabilele de tip reso*r%e sunt folosite pentru pstrarea unor referine ctre
anumite resurse externe cum ar fi conexiuni la baze de date, fiiere, etc. Resursele sunt create
i utilizate de anumite funcii speciale. Datorit specificului acestui tip de date valoarea nici
unei variabile de alt tip nu poate fi convertit la tipul reso*r%e.
Tipul NULL: Valoarea special N5LL este atribuit oricrei variabile care nu a fost iniializat.
Aceast valoare este singura pe care o pot avea variabilele de tip N5LL. Se consider c o
variabil are tipul N5LL dac:
- i s-a atribuit constanta NULL;
- nu a fost iniializat;
- a fost deziniializat (prin intermediul funciei *nset/0 ).
Afiarea mesajelor n PHP
Limbajul PHP ofer mai multe variante de a trimite la browser mesaje i iruri de caractere sau
chiar cod HTML. Cea mai folosit funcie este echo(). Sintaxa corect este:
<?php
echo("sir de caractere");
?>
Instruciunea de mai sus va afia n browser mesajul introdus ntre ghilimele. Funcia e%ho, la
fel ca i print, nu este chiar o funcie, ci mai degrab un constructor al limbajului i nu este
nevoie s folosii parantezele ca pentru o funcie. De fapt, dac dorii s trimitei mai muli
parametri ctre e%ho, nu trebuie s includei aceti parametrii ntre paranteze. Exist chiar i o
variant mai scurt a lui e%ho, dar aceasta funcioneaz doar dac este setat n configuraia
php.ini directiva short_open_tag pe ON. Sintaxa pentru varianta scurt este:
<?=$foo?>
n cazul de mai sus, imediat dup deschiderea tagului php se va afia valoarea variabilei $&oo.
Nu recomand aceast abordare, deoarece nu toate serverele au setat n configuraia lor
short_open_tag pe ON i nu va funciona.
O funcie asemntoare cu e%ho este print. La fel ca i e%ho, nici aceasta nu este chiar o
funcie ci un constructor al limbajului, i nu trebuie s utilizai parantezele. Textul ce urmeaz
a fi afiat trebuie introdus ntre ghilimele simple sau duble, rezultatul fiind uor diferit.
Folosind ghilimelele duble, orice variabil din cadrul stringului este parsat. Astfel, dac am
avea de exemplu:
<?php
$x = 1;
$rezultat = $x*1;
print "Rezultatul inmultirii lui $x cu 1 este $rezultat";
?>
afieaz n browser:
Re;*ltat*l in$*ltirii l*i < %* < este =
Dac am folosi ghilimelele simple (print '...'), variabilele $# i $re;*ltat nu ar fi fost parsate i
output-ul ar fi fost:
Re;*ltat*l in$*ltirii l*i $# %* < este $re;*ltat
Putem afia variabilele i dac folosim ghilimelele simple, >r*p?n,> stringul i intercalndu-l cu
variabile, n forma urmatore, folosind operatorul "."(punct) de concaternare a stringurilor
(irurilor):
<?php
print 'Rezultatul inmultirii lui '.$x.' cu 1 este '.$rezultat;
?>
Pentru a afia caracterele speciale folosite de PHP (ghilimelele simple ', ghilimelele duble ",
backslash-ul \, semnul $) trebuie s le precedai cu semnul \, astfel:
<?php
echo "Semnul dolar \$, back-slash \\";
?>
Ghilimelele trebuie precedate de semnul \ doar dac sunt de acelai tip cu cele care ncadreaz
string-ul. n plus, ntr-un string putei folosi celelalte ghilimele normal. Dac dorii s afiai
doar valoarea unei variabile, putei s nu o ncadrai ntre ghilimele. Exemplu:
<?php
echo $x;
?>
Alte informaii despre aceste funcii, precum i altele asemntoare cu acestea, de genul
print&/0, i &l*sh/0 putei gsi n manualul oficial pe care l putei lua gratuit de pe site-ul oficial
al PHP - www.php.net.
Construiete un site cu php
n continuare, o s ncerc s v prezint cum se poate construi un site cu ajutorul limbajului
PHP. Exemplul prezentat nu este un standard, este doar o modalitate de a vedea cum se poate
construi un site i cum se preiau sau trimite variabilele prin intermediul site-ului. Putei, pe
baza acestui exemplu, s v construii propriul site, n forma preferat de dvs. i adaptnd
modelul acesta la necesitaile voastre.
n exemplul meu, am preferat s am o singur pagin, anume index.php, n care s includ
dinamic coninutul i meniul, n funcie de ce link acceseaz vizitatorul. Putei vedea acest
model ntr-un fel modular, fiecare script fiind de fapt un modul care execut anumite operaii
specifice. Astfel, n pagina index.php se includ mai multe module (scripturi) care luate separat,
fiecare fac anumite lucruri, dar puse mpreun, formeaz pagina de web generat dinamic. n
acest exemplu, nu am folosit o baz de date, dar pe acelai principiu se poate adapta ideea la
un site care preia datele din baza de date.
Partea de sus a paginii (head)
Partea cu meniul orizontal generat dinamic
(partea de body)
meniul
lateral
partea in care se afiseaza
continutul paginilor, si alte
informatii
aici se pot
pune alte
informatii
generate
dinamic
partea de incheiere a paginii (footer)
Dup cum putei vedea alturat, am desprit
fiecare parte a unei pagini n buci, fiecare
bucat este colorat diferit pentru o mai bun
vizualizare. Putei introduce n fiecare bucat
cte un script php care s genereze respectiva
bucat dinamic. Astel, n cazul unei modificri,
va fi mult mai uor s modificai doar scriptul
care se ocupa de o anumit parte a paginii, pe
cnd daca tot site-ul ar fi fost facut static n
HTML, la un site cu 100-200 de pagini chiar i
cea mai mic modificare ar fi nsemnat un chin.
Am numit fiecare script care se ocup de o anumit parte a site-ului astfe:
head.php - conine partea dintre tagurile HTML <head> i </head>
body.php - conine partea dintre tagurile HTML <body> i coninutul paginii
footer.php - conine partea de jos a paginii
n continuare, o s v prezint fiecare modul n parte.
index.php -
- head.php -
- css.php -
- js.php -
- body.php -
- meniu_orizontal.php -
- meniu_vertical.php -
- continut.php -
- contact.php -
- module.php -
- /module/data_ora.php -
- footer.php -
index.php - n care se seteaz nivelul de raportare al erorilor (dac nu dorii ca vizitatorii s
vada eventualele erori raportate de ctre php, putei stabili nivelul 0).Apoi, se verific dac
exist fisierul hea,.php i bo,3.php i se ncarc sau se oprete cu un mesaj de eroare.
head.php - n acest fiier se afiseaz codul html pentru nceputul paginii, i dac exist, se
ncarc i fiierele cu cod CSS i JavaScript folosite n pagin.
css.php - acest fiier conine codul CSS folosit pentru formatarea i afiarea paginii HTML.
js.php - dac se folosete cod JavaScript n pagini, este de preferat s se salveze codul n
acest fiier, pentru a putea avea acces rapid la el n cazul n care doriti s facei modificri.
body.php - conine codul HTML existent ntre tagurile <body> i </body> Dac exist, se
ncarc i fiierele care conin meniul orizontal i/sau vertical, precum i fiierul care afieaz
coninutul paginii cerute. Pe lang acestea, dac dorii s bagai alte scripturi n pagini, se
include i fisierul $o,*le.php
meniu_orizontal.php - conine codul HTML pentru meniul orizontal.
meniu_vertical.php - conine codul HTML pentru meniul vertical
continut.php - afieaz coninutul paginilor, n funcie de linkul cerut. Dac se cer pagini
externe, se verific daca acea pagin exist i se ncarc pentru afiare.
contact.php - poate fi o pagina extern, cu coninut HTML sau PHP, precum i formulare de
contact.
module.php - este un fiier care atunci cnd este accesat, verific ce fiiere exist n
directorul MODULE i le ncarc pe fiecare.
data_ora.php - este un fiier extern, care afieaz cteva informaii despre vizitator.
footer.php - este fiierul care afieaz n josul paginii numele curent al paginii
Acest exemplu l putei descrca de aici i l putei testa i modifica pe serverul dvs.
Cteva informaii despre documentarea i depanarea unui script.
n afar de a furniza nume descriptive fiierelor care conin scripturile dvs. PHP, trebuie s
includei n fiecare script att comentarii care s permit unui cititor s determine cu uurin
utilitatea scriptului, ct i alte informaii referitoare la script. De exemplu, putei include un
comentariu care precizeaz numele fiierului care conine scriptul, astfel nct acesta s apar
n versiunile tiprite ale scriptului. Iat un model sintactic pentru comentariile PHP:
// Scrieti aici comentariul dvs.
Dup cum se poate vedea, un comentariu ncepe cu dou caractere slash, urmate de un
spatiu. n continuare, linia conine comentariul, care poate include orice caractere dorii,
inclusiv caractere speciale.
O modalitate de a crea un comentariu pe mai multe linii este de a ncepe fiecare linie cu
ajutorul caracterelor //. Totui, putei crea un comentariu din mai multe linii i n alte moduri,
dac preferai. Iat un exemplu:
/*
Acesta este un comentariu pe mai multe linii.
Poate fi alcatuit dintr-un numar oricat de mare de linii.
*/
Pentru a ncepe un comentariu alctuit din mai multe linii, scriei caracterele /*, iar pentru a
ncheia comentariul, scriei caracterele */
ntre cele dou perechi de caractere, putei scrie orice text dorii, folosind oricte linii dorii.
Uneori, n locul datelor de ieire ale scriptului, putei vedea unul din urmtoarele:
- Textul scriptului, n loc de datele de ieire ale acestuia
- O caset de dialog, prin care suntei ntrebat dac dorii s descrcai fiierul care conine
scriptul.
- Un mesaj n care se spune c scriptul nu exist
- Un mesaj n care se spune c browserul web nu are permisiunea de a obine accesul la script
- Un mesaj n care se spune c scriptul conine o eroare
La vizualizarea rezultatelor unui script PHP se pot produce numeroase erori, chiar dac scriptul
n sine e corect. Dac vedei textul scriptului sau o caset de dialog prin care suntei ntrebat
dac dorii s descrcai fiierul care conine scriptul, este posibil ca extensia fiierului script
s fie incorect sau ca serverul PHP s nu funcioneze. Dei fiierele script PHP trebuie s aib,
n general, extensia .php, este posibil ca un administrator de sistem s configureze un server
PHP astfel nct acesta s impun o alt extensie de fiier.
Dac vedeti un mesaj n care se spune c scriptul nu exist, este posibil ca s fi tastat incorect
adresa URL. Verificai dac ai tastat corect adresa URL precum i dac ai ataat corect la
aceasta numele fiierului care conine scriptul, folosind un slash numai dac adresa URL nu se
ncheie cu un atare caracter.
Dac vedei un mesaj n care se arat c browserul web nu are permisiunea de a obine
accesul la script, poate c este necesar s modificai permisiunile fiierului script (cmod).
Dac vedei un mesaj n care se spune c scriptul conine o eroare, verificai dac nu au
aprut urmtoarele probleme:
- O eroare de tastare, cum ar fi scrierea greit a cuvntului echo
- O eroare de punctuaie, cum ar fi paranteze, ghilimele duble sau punct i virgul lips sau
inserate greit.
- Neincluderea sau includerea eronat a liniilor de delimitare a scriptului, n spe <?php i ?>
- Un marcaj de comentariu (//) care lipsete sau a fost introdus gresit.
irurile i caracterele speciale
Spre deosebire de numere ntregi i de numere duble, care conin cu precdere cifre, irurile
pot conine orice caracter. Ca atare, irurile sunt utile pentru stocarea datelor care nu pot fi
calculate, precum nume i adrese. De asemenea, irurile pot fi utilizate pentru stocarea
datelor numerice. Pentru a specifica un ir n PHP, caracterele care alctuiesc irul sunt incluse
ntre ghilimele duble; de exemplu, irul reprezentnd numele "Albert Einstein". Aa cum am
mai spus, un ir poate conine date numerice; de exemplu , "3.141516". PHP faciliteaz
includerea n iruri a unor caractere speciale, precum caracterele de salt la linie nou sau retur
de car, prin furnizarea de secvene escape care reprezint caractere speciale. Iat secvenele
escape folosite n PHP:
\n - salt la linie noua
\r - retur de car
\t - caracter de tabulare pe orizontal
\\ - backslash
\$ - simbolul dolarului
\" - ghilimele duble
Ca exemplu, iat un ir care include un retur de car, urmat de un salt la linie nou:
"Salut! \r\n".
Reinei c fiecare secven escape ncepe cu un backslash (\). Pentru a include un backslash
ntr-un ir, trebuie s folosii secvena escape adecvat, care este alctuit din dou caractere
backslash. Pentru a introduce ghilimele duble n cadrul unui ir fr a folosi secventa escape,
putei include irul ntre ghilimele simple astfel:
'Pe ea o cheama "Nikita"'
Aceasta este util cnd dorii s introducei ntr-un ir taguri HTML, astfel:
$sir = '<a href="index.php" target="_blank">Prima pagin</a>';
Dup cum observai deoarece standardul HTML necesit folosirea ghilimelelor pentru a nu se
ncurca cu codul php am folosit pentru acest sir ghilimele simple. Sigur, acest cod se poate
scrie i asa:
$sir = "<a href=\"index.php\" target=\"_blank\">Prima pagin</a>";
dar personal mi se pare greu inteligibil acest cod i la un volum mare de date pot apare multe
erori datorate scrierii incorecte a codului html n interiorul codului php.
Operatori PHP
Interpretorul PHP permite folosirea a nou tipuri diferite de operatori. Acetia opereaz asupra
unor expresii (una, doua sau trei) i furnizeaz ca rezultat o alt expresie (rezultatul operaiei
corespunztoare).
Operatori aritmetici:
Toi operatorii aritmetici opereaz asupra a dou expresii (operanzi). Exist cinci astfel de
operatori:
- adunare ('+');
- scdere ('-');
- nmulire ('*');
- mparire ('/');
- rest ('%').
Aceste operaii se aplic asupra unor valori care reprezint tipuri numerice. Dac unul dintre
operanzi nu are tip numeric, atunci el va fi convertit automat la o valoare ntreag. Dac cel
puin unul dintre operanzi (dup efectuarea eventualelor conversii necesare) este un numr
real, atunci rezultatul operaiei va fi tot un numr real, cu excepia operatorului rest; rezultatul
operaiei de determinare a restului este ntotdeauna un numr ntreg. Dac ambii operanzi
sunt numere ntregi, atunci rezultatul va fi un numr ntreg, cu excepia mpririi al crei
rezultat este ntotdeauna un numr real. Dac operatorul rest este aplicat asupra unor numere
reale, atunci rezultatul este un numr ntreg. Nu este permis mprirea la valoarea 0. Dac
al doilea operand asupra cruia se aplic unul dintre operatorii '/' sau '%' are valoarea 0, va fi
semnalat o eroare.
Operatori de comparare:
Interpretorul PHP pune la dispozitie mai muli operatori care pot fi folosii pentru compararea a
dou valori. Expresiile n care apar astfel de operatori au ca rezultat valori logice (true sau
false).
Cel mai des ntlnit operator este cel de atribuire, definit prin semnul =
Dac scriem $# = < nu nseamn c $x este egal cu 1 ci c i s-a acordat valoarea 1. Dac
scriem $re;*ltat = $# @ $3 nu nseamn c $re;*ltat este egal cu suma celor dou, ci c i-am
atribuit (acordat) valoarea sumei celor dou.
Operatorul de egalitate este == si se folosete cel mai des n propoziii condiionale, pentru a
testa egalitatea. Opusul su, !=, este operatorul de inegalitate i se folosete n acelai scop.
Operatorul de egalitate se folosete pentru a compara egalitatea a dou valori. Pentru a v
lmuri cum st treaba cu egalitatea i atribuirea, testai urmtorul cod:
Cod:
<?php
$x = 1;
$y = 7;
if ($x == $y)
{
print "$x este egal cu $y";
}
if ($x != $y)
{
print "$x este diferit de $y";
}
?>
Ali operatori folosii pentru compararea valorilor variabilelor sunt:
'>' mai mare
'>=' mai mare sau egal
'<' mai mic
'<=' mai mic sau egal
Exemplu:
Cod:
<?php
$x = 5;
$y = 4;
if ($x > $y)
{
print "$x este mai mare ca $y";
}
if ($x <= $y)
{
print "$x este mai mic sau egal cu $y";
}
?>
'==' - rezultatul este true dac cele dou expresii au aceeai valoare;
'===' - rezultatul este true dac cele dou expresii au aceeai valoare i au acelai tip;
'!=' sau '<>' - rezultatul este true dac cele dou expresii au valori diferite;
'!==' - rezultatul este true dac cele dou expresii au valori diferite sau au tipuri diferite;
'<' - rezultatul este true dac valoarea primei expresii este mai mic dect valoarea celei de-
a doua expresii;
'>' - rezultatul este true dac valoarea primei expresii este mai mare dect valoarea celei de-
a doua expresii;
'<=' - rezultatul este true dac valoarea primei expresii este mai mic sau egal cu valoarea
celei de-a doua expresii;
'>=' - rezultatul este true dac valoarea primei expresii este mai mare sau egal cu valoarea
celei de-a doua expresii.
Pe lng acestea exist i operatorul condiional '?' care are forma e#presie<A
e#presie=!e#presieB i are ca rezultat valoarea expresiei e#presie= dac valoarea expresiei
e#presie< este true (eventual dup conversia la tipul boolean) sau valoarea expresiei
e#presieB n caz contrar.
Operatori pentru iruri de caractere:
Operatorii pentru stringuri sunt '.' (punct) pentru concaternare i '.=' (punct i egal) pentru
atribuirea concaternrii. Aceti operatori sunt folosii pentru a unii stringuri, n felul urmator:
Cod:
<?php
// concaternarea stringurilor
$test = 'Am scris un '.'text'.'oarecare';
print $test;
// pe ecran va fi afisat "Am scris un text oarecare"
// concaternarea stringurilor cu variabile
$nr = 5;
print 'Am scris numarul '.$nr.' si un text '.' oarecare';
// pe ecran va fi afisat "Am scris numarul 5 si un text oarecare"
// atribuirea concaternarii
$nr = 6;
$text = "Un text ";
$text .= "oarecare ";
$text .= "si numarul ".$nr;
print $text;
// pe ecran va fi afisat "Un text oarecare si numarul 6"
?>
Operatori pe bii i operatori logici:
Interpretorul PHP pune la dispoziie ase operatori care opereaz asupra biilor unui numr
ntreg sau ai unui ir de caractere. Acetia sunt:
- conjuncie ('&') - SI (AND);
- disjuncie ('|') - SAU (OR);
- disjuncie exclusiv ('^') - SAU exclusiv (XOR);
- negaie ('~') - NU (NOT);
- deplasare la stnga ('<<');
- deplasare la dreapta ('>>').
Operatorii logici v vor veni la ndemn n execuia scriptului atunci cnd avei nevoie s
lucrai cu valori de adevr. S presupunem c la intrarea n seciunea de administrare avem
un formular care cere numele i parola de acces n seciune. Pentru contruirea expresiilor
logice operanzii trebuie s aib tipul boolean; dac operatorii au alt tip, valoarea este
convertit la o valoare boolean. Scriptul PHP ar putea verifica aceste informaii pentru a
autoriza accesul n seciune folosind operatorii logici astfel:
- operatorul 'xor' (SAU exclusiv)
Expresia n care apare operatorul 'xor' va avea valoarea true dac exact unul dintre operanzi
are valuarea true
- operatorul '!' (NOT)
if (!parola_e_buna) ... parola nu este bun, accesul este interzis
if (!parola_nu_e_buna) ... parola e bun, accesul este permis
Operatorul '!' returneaza TRUE dac valoarea iniial de adevr e FALSE i FALSE dac
valoarea iniial este TRUE.
- operatorul '||' (OR)
if (numele_este_valid) || parola_este_buna) ...
verific dac numele sau parola sunt valide i dac oricare dintre ele este, returneaz valoarea
de adevr TRUE. n acest exemplu de pseudocod dac numele ar fi valid dar parola nu, i-am
acorda utilizatorului acces mai departe, ceea ce nu este de dorit. Trebuie s fim siguri c i
numele i parola sunt valide. Operatorul '||' returneaz TRUE dac oricare din valorile
verificate e TRUE. Returneaz FALSE doar dac amndou sunt FALSE.
- operatorul '&&' (AND)
if (numele_este_valid && parola_este_buna) ...
dac att numele ct i parola sunt valide putem acorda utilizatorului acces n seciunea de
administrare. Operatorul '&&' returneaz TRUE doar dac ambele valori verificate sunt TRUE.
El returneaz FALSE dac oricare dintre ele este FALSE (sau dac amndou sunt FALSE).
Operatori de atribuire:
Primul operand asupra cruia este aplicat un astfel de operator de atribuire trebuie s fie o
variabil, iar al doilea poate fi o expresie.
Operaia Varianta scurt Varianta standard
adunare ('+=') $a += 2 $a = $a + 2
scdere ('-=') $a -= 2 $a = $a - 2
nmulire ('*=') $a *= 2 $a = $a * 2
mprire ('/=') $a /= 2 $a = $a / 2
rest ('%=') $a %= 2 $a = $a % 2
conjuncie ('&=') $a &= 2 $a = $a & 2
disjuncie ('|=') $a |= 2 $a = $a | 2
disjuncie exclusiv ('^=') $a ^= 2 $a = $a ^ 2
deplasare la stnga ('<<=') $a <<= 2 $a = $a << 2
deplasare la dreapta ('>>=') $a >>= 2 $a = $a >> 2
concaternare ('.=') $a .= "2" $a = $a . "2"
Exemplu:
Cod:
<?php
$b = 2;
$a = 1;
echo "<TT>$a += $b = ";
echo $a += $b;
$b = 2;
$a = 1;
echo "<br>$a -= $b = ";
echo $a -= $b;
$b = 2;
$a = 1;
echo "<br>$a *= $b = ";
echo $a *= $b;
$b = 2;
$a = 1;
echo "<br>$a /= $b = ";
echo $a /= $b;
$b = 2;
$a = 1;
echo "<br>$a %= $b = ";
echo $a %= $b;
$b = 2;
$a = 1;
echo "<br>$a &= $b = ";
echo $a &= $b;
$b = 2;
$a = 1;
echo "<br>$a |= $b = ";
echo $a |= $b;
$b = 2;
$a = 1;
echo "<br>$a ^= $b = ";
echo $a ^= $b;
$b = 2;
$a = 1;
echo "<br>$a <<= $b = ";
echo $a <<= $b;
$b = 2;
$a = 1;
echo "<br>$a >>= $b = ";
echo $a >>= $b;
$b = 2;
$a = 1;
echo "<br>$a .= $b = ";
echo $a .= $b;
echo "</TT>";
?>
Rezultatul codului de mai sus este:
1 += 2 = 3
1 -= 2 = -1
1 *= 2 = 2
1 /= 2 = 0.5
1 %= 2 = 1
1 &= 2 = 0
1 |= 2 = 3
1 ^= 2 = 3
1 <<= 2 = 4
1 >>= 2 = 0
1 .= 2 = 12
Operatori de incrementare i decrementare:
Operatorul de incrementare (++) are ca efect creterea cu 1 a valorii unei variabile, iar cel de
decrementare (--) are ca efect scderea cu 1 a valorii variabilei. Tipul variabilei poate fi ntreg
sau real. Dac operatorul precede variabila, atunci rezultatul expresiei este valoarea obinut
dup incrementare sau decrementare. Dac variabila precede operatorul, atunci rezultatul
expresiei este valoarea variabilei naintea incrementrii sau decrementrii. Cu alte cuvinte,
dac operatorul precede variabila, atunci valoarea variabilei este mai nti modificat i apoi
utilizat, iar dac variabila precede operatorul, atunci valoarea ei este mai nti utilizat i apoi
modificat.
Aceti operatori pot fi utilizai i pentru variabile care conin iruri de caractere. Operatorul de
incrementare duce la creterea cu 1 a codului ASCII a ultimului caracter din ir dac acesta
este o litera sau cifr. n cazul n care litera este 'z', respectiv 'Z', sau cifra este '9', atunci ea
devine 'a', respectiv 'A', sau cifra '0' i se ncearc incrementarea penultimului caracter. Dac
aceasta este tot '9', 'z' sau 'Z' se aplic acelai procedeu i se trece la antepenultimul
caracter. Procedeul continu pn n momentul n care se ajunge la un caracter care nu este
'9', 'z' sau 'Z' sau se ajunge la nceputul irului. n acest ultim caz, la nceputul irului se
adaug caracterul '1', 'a' sau 'A'. Incrementarea nu are nici un efect pentru caracterele care
nu sunt cifre sau litere.
Decrementarea irurilor de caractere nu are nici un efect, valorile variabilelor rmnnd
nemodificate. Exist o singur excepie i anume irurile care reprezint numere ntregi sau
reale. Acestea sunt incrementate sau decrementate potrivit regulilor pentru valorile numerice.
Exemplu:
Cod:
<?php
$a = 7;
echo "<tt>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>a++</tt><i> este </i><tt>
";
echo $a++;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>++a</tt><i> este </i><tt>
";
echo ++$a;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>a--</tt><i> este </i><tt>
";
echo $a--;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>--a</tt><i> este </i><tt>
";
echo --$a;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
$a = 7.5;
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>a++</tt><i> este </i><tt>
";
echo $a++;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>++a</tt><i> este </i><tt>
";
echo ++$a;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>a--</tt><i> este </i><tt>
";
echo $a--;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>--a</tt><i> este </i><tt>
";
echo --$a;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
$a = "PHP";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>a++</tt><i> este </i><tt>
";
echo $a++;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>++a</tt><i> este </i><tt>
";
echo ++$a;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>a--</tt><i> este </i><tt>
";
echo $a--;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "<br>a = $a";
echo ": </tt><i>Rezultatul operatiei </i><tt>--a</tt><i> este </i><tt>
";
echo --$a;
echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t
t>$a.";
echo "</tt>";
?>
Rezultatul codului de mai sus este:
a = 7: Re;*ltat*l operatiei a++ este 7. No*a Caloare a Cariabilei a este 8.
a = 8: Re;*ltat*l operatiei ++a este 9. No*a Caloare a Cariabilei a este 9.
a = 9: Re;*ltat*l operatiei a-- este 9. No*a Caloare a Cariabilei a este 8.
a = 8: Re;*ltat*l operatiei --a este 7. No*a Caloare a Cariabilei a este 7.
a = 7.5: Re;*ltat*l operatiei a++ este 7.5. No*a Caloare a Cariabilei a este 8.5.
a = 8.5: Re;*ltat*l operatiei ++a este 9.5. No*a Caloare a Cariabilei a este 9.5.
a = 9.5: Re;*ltat*l operatiei a-- este 9.5. No*a Caloare a Cariabilei a este 8.5.
a = 8.5: Re;*ltat*l operatiei --a este 7.5. No*a Caloare a Cariabilei a este 7.5.
a = PHP: Re;*ltat*l operatiei a++ este PHP. No*a Caloare a Cariabilei a este PHQ.
a = PHQ: Re;*ltat*l operatiei ++a este PHR. No*a Caloare a Cariabilei a este PHR.
a = PHR: Re;*ltat*l operatiei a-- este PHR. No*a Caloare a Cariabilei a este PHR.
a = PHR: Re;*ltat*l operatiei --a este PHR. No*a Caloare a Cariabilei a este PHR.
Aceti operatori sunt utili de exemplu pentru monitorizarea unui download, dac dorii s tii
de cte ori a fost descrcat un fiier dintr-o anumit pagin. La fiecare accesare a fiierului,
scriptul incrementeaz cu 1 i afieaz valoarea. (scriptul l gndii voi, doar nu vrei totul la
tav)
Operatori pentru controlul erorilor:
n PHP exist un operator (@) care permite ignorarea erorilor. Dac este aplicat asupra unei
expresii care ar duce la afiarea unui mesaj de eroare, atunci mesajul respectiv nu va fi afiat.
Operatori de eecuie:
Interpretorul PHP permite executarea unor comenzi sistem prin intermediul operatorului (` `)
. Comanda respectiv este cuprins ntre apostroafele inverse (tasta de lng 1 deasupra
tastei tab), iar rezultatul acestei comenzi este un ir de caractere care reprezint i rezultatul
expresiei.
Urmatorul s%ript PHP determin execuia pe serCer a comenzii help /? i afiarea rezultatului
n fereastra programului de navigare.
Cod:
<?php
echo "<PRE>".`help /?`."</PRE>";
?>
Atenie!
Pe unele configuraii de server nu se permite executarea de comenzi prin intermediul PHP (ca
msur de siguran, altfel oricine ar putea da un format sau reboot la server prin intermediul
unui script PHP).
Operatori pentru !ectori:
Singurul operator care poate fi aplicat asupra vectorilor este cel de concaternare (+)
Rezultatul concaternrii a doi vectori este un vector care conine elementele din cei doi vectori.
Dac cei doi vectori conin elemente cu aceeai cheie, atunci este pstrat doar elementul din
vectorul care reprezint primul operand.
Exemplu:
Cod:
<?php
$x[2] = 2;
$x[4] = 4;
$x[5] = 5;
$x[7] = 7;
$y[1] = 100;
$y[2] = 200;
$y[3] = 300;
$y[4] = 400;
$y[5] = 500;
$z = $x + $y;
echo "$z[1] $z[2] $z[3] $z[4] $z[5] $z[7]";
?>
Rezultatul codului de mai sus este:
100 2 300 4 5 7
Ordinea operaiilor:
Evident, o expresie poate conine mai muli operatori, din categorii diferite. Pentru a indica
ordinea n care trebuie efectuate calculele, trebuie stabilit o ordine a operaiilor. Pentru
aceasta a fost definit pre%e,enta i aso%iatiCitatea operaiilor.
Valoarea expresiilor corespunztoare operatorilor cu precedenta mai mare va fi calculat
naintea valorilor expresiilor cu o precedent mai mic. De exemplu, pentru expresia " # $ %
& va fi efectuat mai nti nmulirea $ % &, datorit faptului c operatorul '*' are precedenta
mai mare dect cea a operatorului '+'.
Dac o expresie sau o subexpresie conine numai operatori cu aceeai precedent, atunci
operaiile se vor efectua n ordinea determinat de asociativitatea acestor operatori care poate
fi de la dreapta la stnga sau de la stnga la dreapta. Toi operatorii cu aceeai precedent au
aceeai tip de asociativitate.
Evident, pentru a modifica ordinea implicit de efectuare a operaiilor pot fi folosite paranteze
pentru a indica faptul c o anumit operaie trebuie efectuat naintea altora, chiar dac
acestea din urm au o precedent mai mare.
Trebuie observat faptul c, datorit asociativitii de la dreapta spre stnga a operatorilor de
atribuire, expresiile de tipul 'a ( 'b ( " sunt valide. Mai nti se va efectua atribuirea 'b (
"; variabila $b va primi valoarea 1 i, datorit faptului c rezultatul unei operaii de atribuire
este valoarea atribuit variabilei care reprezint primul operand, n continuare se va efectua
atribuirea 'a ( ", deci i variabila $a va primi tot valoarea 1. Tabelul de mai jos conine o
list cu majoritatea operatorilor din PHP. Liniile tabelului indic precedenta, n sensul c un
operator are aceeai precedent cu operatorii de pe linie n care apare i o precedent mai
mare dect oricare operator aflat pe o linie anterioar. n acest tabel se observ faptul c, dei
operatorii '&&' i 'and', respectiv '||' i 'or' realizeaz aceeai operaie, ei au precedente
diferite, deci nu sunt echivaleni din toate punctele de vedere.
Tip asociativitate Tip Operanzi
de la stnga la dreapta unar . (selectare)
de la stnga la dreapta binar or
de la stnga la dreapta binar xor
de la stnga la dreapta binar and
de la stnga la dreapta binar print
de la stnga la dreapta binar
=
+=
-=
*=
/=
.=
%=
&=
|=
^=
~=
<<=
>>=
de la stnga la dreapta ternar ? :
de la stnga la dreapta binar ||
de la stnga la dreapta binar &&
de la stnga la dreapta binar |
de la stnga la dreapta binar ^
de la stnga la dreapta binar &
fr asociativitate binar
==
!=
===
!==
fr asociativitate binar
<
<=
>
>=
de la stnga la dreapta binar
<<
>>
de la stnga la dreapta binar
+
-
. (concaternare)
de la stnga la dreapta binar
*
/
%
de la stnga la dreapta unar !
~
++
--
(int)
(float)
(string)
(array)
(object)
@
de la stnga la dreapta unar [
fr asociativitate unar new
n tabel este prezentat i numrul expresiilor asupra crora acioneaz un operand. Operatorii
unari acioneaz asupra unei singure expresii, cei binari asupra a dou expresii i singurul
operator ternar asupra a trei expresii.
n continuare sunt civa operatori care execut operaii utile:
- abs(x) - returneaz valoarea absolut a lui x;
- ceil(x) - returneaz valoarea x, rotunjit la ntregul imediat superior;
- floor(x) - returneaz valoarea x, rotunjit la ntregul imediat inferior;
- max(x, y, ...) - returneaz valoarea maxim a unui set de valori;
- min(x, y, ...) - returneaz valoarea minim a unui set de valori;
- pow(x, n) - returneaz numrul x, ridicat la puterea specificat n;
- strftime(f) - returneaz data curent, formatat conform coninutului parametrului f;
- sqrt(x) - returneaz rdcina ptrat a lui x
Mai jos sunt cateva exemple:
$l*ngi$e = sDrt/$arie0E
Acest exemplu calculeaz lungimea laturilor unui ptrat, dac este cunoscut aria ptratului.
n continuare este prezentat modul de utilizare al funciei $a#, care preia mai multe
argumente:
$p*n%ta4_%astigator = $a#/$p*n%ta4<. $p*n%ta4=. $p*n%ta4B0E
Un alt exemplu calculeaz aria unui cerc de raz dat:
Cod:
<?php
$raza = 2.0;
$pi = 3.14159;
$arie = $pi * $raza * $raza;
echo "raza = ";
echo $raza;
echo "<br>arie = ";
echo $arie;
?>
Cteva idei utile pentru securitatea paginilor web
Regula numrul unu a securitii online este: nu v ncredei niciodat n utilizator.
ntotdeauna verificai datele trimise ctre server i "curai-le" nainte de a le utiliza. Pentru
aceasta trebuie s luai n considerare cteva posibile "guri" de securitate. Menionez c cele
scrise aici sunt doar noiuni generale, pentru o securitate ridicat ar trebui sa avei noiuni
specializate de baze de date i de administrare a serverelor web.
1. Variabilele globale
Avnd variabilele globale din php.ini setate pe ON putei accesa datele trimise prin formulare
mai simplu: $Cariabila n loc de $_1ET['Cariabila', la fel i pentru POST sau F-LES. Dac
scriptul nu este foarte bine gndit, variabilele globale pot prezenta un risc major de securitate.
Din acest motiv php.ini este distribuit cu globals=o&& n ultimele versiuni.
2. Ghilimele "magice"
Dac n php.ini $agi%_D*otes_gp% sunt OFF folosii funcia a,,slashes pentru a preceda
ghilimelele din datele trimise de utilizatori cu caracterul \. Dac $agi%_D*otes_gp% sunt ON,
PHP adaug automat caracterul \ nainte de ghilimele dar dac ele sunt OFF, ghilimelele din
input v pot crea probleme serioase.
Ca exemplu, s presupunem c interogarea SQL de verificare a numelui i a parolei pentru
nregistrarea pe site este
SELECT * FROM users WHERE nume='$nume' AND parola='$parola'
i dac interogarea este executat cu succes, utilizatorul este logat. n acest caz, folosind
parola 'OR' 1=1 oricine poate avea acces pe site deoarece interogarea
SELECT * FROM user WHERE nume='un nume oarecare' AND parola=" OR '1=1'
este executat cu succes i returneaz un rezultat (toate nregistrarile din baza de date, de
fapt). Mai mult, atunci cnd v ateptai ca baza de date s returneze un singur rnd, verificai
acest lucru i nu dac interogarea s-a executat cu succes. Implicit n php.ini
$agi%_D*otes_gp% sunt ON pentru a v proteja de astfel de atacuri, dar este bine s verificai
nainte de a renuna la a,,slashes.
3. Includere
ncercai s evitai includerea "vizibil" a fiierelor n forma http://site.ro/fisier.php?
file=cutare.html pentru a include fiiere n cadrul unei pagini. Cu puin neatenie din partea
voastr atacatorul ar putea accesa astfel de informaii sensibile din cadrul sistemului. Nu
includei fiiere strine. PHP poate "include" fiiere aflate pe alte servere dect cel care ruleaz
dac setarea URL &open 9rappers este activat n php.ini. n exemplul de mai sus, un atacator
ar fi putut accesa adresa
http://site.ro/fisier.php?file=http://www.rau.ro/scriptultau.php
pentru a include n fisier un script localizat pe alt server i astfel obine acces ctre toate
resursele sistemului la care are acces PHP, putnd rula comenzi de sistem, afia informaii
confideniale sau sterge baza de date. Nu permitei includerea fiierelor din alt parte dect de
pe serverul vostru. Setai allo9_*rl_&open=OFF n php.ini.
4. Formulare
Folosii metoda POST n formulare atunci cnd informaia din acestea urmeaz s fie introdus
n baza de date. Dac variabilele globale sunt OFF n php.ini sau metoda de transmitere a
formularului este 1ET, un utilizator ru intenionat ar putea accesa adresa dvs. i ar introduce
comentariul lui (exemplu "blabla") n baza voastr de date fr s treac propriuzis prin site.
Aa v putei trezi c nu mai avei spaiu pe server iar n baza de date sunt cteva milioane de
comentarii care spun acelai lucru "blabla".
Verificarea provenienei cererilor ctre server este foarte important i n alt caz: formularele
de loghin. Cineva care tie numele de utilizator ar putea ncerca s v gseasc parola foarte
usor. n acest caz va trebui s punei o protecie suplimentar care s nu permit mai mult de
X ncercri consecutive euate de logare pentru un nume de utilizator. Aceast problem se
rezolva uor folosind sesiunile. n momentul cnd cineva ncearc s trimita numele i parola
din formular putem seta o variabil de sesiune $_SESS-ON['login_%o*nt' care s in minte
numrul de ncercri. Cnd valoarea acesteia trece de 3 (ncercri nereuite) nici mcar nu
mai interogai baza de date pentru a verifica datele trimise. Variabila de sesiune va rmne n
memorie ct timp browserul este deschis i sesiunea activ (opiunea implicit a PHP de
meninere a sesiunilor active este de o or). Dac atacatorul ateapt o ora sau i nchide
browserul, sesiunea va fi nchis i va putea de alte X ori s se logheze. De cele mai multe ori
acest msur de siguranta este suficient pentru a preveni ncercrile de aflare a parolelor.
5. Extensii
O practic obinuit este de a acorda extensia .in% fiierelor care conin biblioteci de funcii ce
urmeaz a fi incluse i folosite n cod. PHP nu parseaz fiierele cu extensia .in% i dac
acestea sunt apelate direct ele sunt trimise plain text ctre browser. Nu punei informaii
sensibile (precum nume i parola) n fiiere cu extensia .in%, .t#t, sau .ht$l care pot fi
accesate i vzute. Folosii pentru aceste fiiere extensia .php care, dac sunt accesate direct,
vor fi rulate fr s afieze informaiile coninute n ele.
6. Comanda CHMOD - setarea atributelor
Comanda CHMOD (abreviere pentru change mode permissions of a file) este folosit pentru a
schimba modul de acces (de permitere) a fiierelor i directoarelor de pe server. Setarea poate
afecta modul cum poate fi citit, sau cum se poate executa un fiier pe server. De exemplu,
dac avei un fiier .php care trebuie s execute o comand de scriere pe server ntr-un fiier
.t#t trebuie s i dai dreptul s poata fi executat iar la fiierul .t#t trebuie s i dai dreptul de
a se putea scrie n el. Aveti 3 tipuri de acces - OFNER - 1RO5P - FORL( - fiecare cu cte 3
setri - REA( - FR-TE - EGE:5TE -
Este bine ca la FORL( s nu dai dect acces la citire (pentru a putea accesa paginile de pe
site) dar nu i drepturi de scriere sau execuie (pentru c nu dorii ca oricine s v scrie ce
vrea n respectivul fiier .t#t)
n programul TOTAL COMMANDER (pe care eu l folosesc i pentru FTP) setarea atributelor pe
server se face din meniul FILES - CHANGES ATTRIBUTES. Fiecare program de FTP are n
meniul lui setare pentru atributele fiierelor de pe server.
7. Cookies
Dac avei o seciune de administrare pe site, unde accesul este restrictionat doar la membrii
de exemplu, este bine ca n toate paginile din aceast seciune s nclud o pagin de
verificare a accesului. Aceast pagina va verifica la fiecare accesare dac utilizatorul este
nregistrat i are acces pe pagina respectiv i permite rularea paginii doar dac utilizatorul
este nregistrat. Fr aceast verificare, un utilizator ar putea accesa paginile din seciunea de
administrare fr s treac prin formularul de nregistrare. Dup autentificarea propriu-zis,
vom folosi variabile de sesiune pentru a pstra n memorie cteva informaii despre
autentificare, pentru a le verifica mai trziu, atunci cnd accesm alte pagini din cadrul
seciunii de administrare. Pornim nti sesiunea dup care trecem la salvarea informaiilor n
ea ca n exemplul de mai jos:
session_start/0E
$_SESS-ON ['n*$e_a,$in' = $_POST ['n*$e'E
$_SESS-ON ['parola_en%riptata' = $parolaEn%riptataE
Pe lng acestea, pentru o i mai mare siguran, vom salva id-ul sesiunii n alt variabil.
Toate sesiunile au un id unic, un string care seamn cu rezultatul unei criptri MD5:
$_SESS-ON [')e3_a,$in' = session_i,/0E
Cu autentificare fcut, spunem scriptului s ncarce prima pagin din seciunea de
administrare:
hea,er />lo%ation! a,$in.php>0E
n continuare pentru a mpiedica accesul neautorizat la paginile din aceast seciune, scriem
un mic script de verificare a datelor sesiunii nainte de a ncrca orice pagin din seciunea de
administrare:
session_start/0E
i& /$_SESS-ON [')e3_a,$in' 7= session_i, /00 H
print 'A%%es nea*tori;at7'E
e#itE
I
8. Loguri de acces
Pentru o verificare ulterioar a persoanelor care ncearc s intre n paginile restrictionate de
pe site, este bine s salvm n baza de date (sau ntr-un fiier text) numele, parola criptata,
ora, data, semntura browserului i ip-ul. Aa vei tii cine a ncercat s v sparg site-ul i
putei crea un script care sa verifice de exemplu ip-ul i dac corespunde cu unul din cele care
sunt blocate s nu aib acces la nici una din pagini (chiar dac gsete userul i parola
corecte)
9. Criptarea parolelor cu MD5
Parolele care sunt salvate n baza de date este recomandat s le inei criptate, astfel dac
cineva ncearc s citeasca parolele le va vedea criptate.
-NSERT -NTO a,$in VAL5ES />a,$inistrator>. $,J/>parola>00E
Criptarea folosind md5 nu este reversibila (i astfel nici dvs., nici altcineva nu o va putea afla
chiar dac are acces la baza de date).
10. Pagina index.php n subdirectoare
Dac avei mai multe directoare i subdirectoare pe server este recomandat pentru a preveni
accesul la datele aflate n aceste directoare s introducei n fiecare director o pagin numit
in,e#.ht$l sau in,e#.php care s fac redirectarea automat ctre pagina principal a site-ului.
Astfel minimizati riscul s intre cineva i s vad tot ce este n aceste subdirectoare.
11. Fiierul .htaccess
Pentru a bloca accesul la un anumit director (sau chiar la tot site-ul) puteti crea un fiier numit
.hta%%ess (cu punct nainte) n care s introducei ip-ul care dorii s l blocai (sau care s
aib acces)
Or,er (en3.Allo9
Allo9 &ro$ all
n exemplul de mai sus, toat lumea are acces. Dac de exemplu ip-ul 192.168.1.1 nu dorii
s aib acces la acel director scriei
(en3 &ro$ <K=.<LM.<.<
Atenie, s nu v blocai singuri ip-ul la site, c altfel trebuie s luai legtura cu
administratorul serverului s stearg fiierul ca s putei intra din nou pe site, sau sa scrieti
prin FTP un nou fiier .htaccess. (la subdirectoare tergei directorul sau salvai un alt fiier
.htaccess) n cazul n care dup de ai pus fiierul pe server nu l vedei, el este acolo dar
serverul seteaza acest nume de fiier ca fiier ascuns.
12. Roboii de cutare
Motoarele de cutare pot indexa tot ce se afl la voi pe site. Dac dorii ca un fiier sau
director s nu fie indexat de ctre motoarele de cutare, trebuie s creai un fiier numit
robots.t#t care s se afle n directorul principal de pe site (nu n subdirectoare). n el scriei
urmtoarele comenzi:
# robots.txt for http://www.tutoriale.far-php.ro
User-agent: *
Disallow: /cache/
Disallow: /admin
disallow: /search
unde pentru fiecare director sau fiier se specific locaia i numele. Pentru mai mult
siguran, am gsit pe web un mic script care verific tipul de browser i dac nu este un
browser cunoscut nu permite accesul (dac cineva ncearc s citeasc paginile cu programe
spion sau gen web offline).
Cum am specificat i la nceputul acestui articol, cele spuse mai sus nunt doar cateva indicii i
idei pentru a v putea proteja mai bine paginile.
Structuri de control n PHP
Dup cum tii, instruciunile PHP sunt separate prin caracterul ';'. Deseori, suntem nevoii s
grupm mai multe instruciuni pentru a forma un bloc. Astfel, obinem instruciunile compuse
care sunt formate din mai multe instruciuni simple, separate prin caracterul ';'. n PHP,
instruciunile compuse au urmtoarea sintaxa:
H instr*%ti*ne 6< instr*%ti*ne 6= ... instr*%ti*ne 6n I
Instruciunile care formeaz instruciunea compus pot fi de orice tip: orice structur de
control, alte instruciuni compuse etc. Aadar un bloc de instructiuni (o instruciune compus),
n PHP, este delimitat de acolade.
Structura if
Una dintre cele mai importante structuri n orice limbaj este cea alternativa. n PHP sintaxa
acestei structuri este urmtoarea:
i& /%on,itie0 instr*%ti*ne
Folosirea unei astfel de structuri indic faptul c instruciunea se va executa dac i numai
dac valoarea expresiei %on,itie (eventual dup conversia la tipul boolean) este true.
Construcia if - else
n foarte multe cazuri dorim s executm o alt instruciune dac valoarea expresiei condiie
este false. n PHP putem utiliza o construcie de tipul if ) else n acest scop. Sintaxa este:
i& /%on,itie0 instr*%ti*ne 6<
else instr*%ti*ne 6=
Construcia elseif
Uneori, suntem nevoii s folosim structuri alternative mbricate n diferite scopuri. Folosind
construcii de tipul if ) else vom obine o secven de tipul:
i& /%on,itie 6<0 instr*%ti*ne 6<
elsei& /%on,itie 6=0 instr*%ti*ne 6=
else ...
elsei& /%on,itie 6n0 instr*%ti*ne 6n
else instr*%ti*ne 6n@<
Limbajul PHP permite folosirea unei prescurtri i anume construcia elseif. Practic, aceasta
nlocuieste un else urmat de un if. Folosind aceast structur, codul anterior poate fi scris
astfel:
i& /%on,itie 6<0 instr*%ti*ne 6<
elsei& /%on,itie 6=0 instr*%ti*ne 6=
elsei& ...
elsei& /%on,itie 6n0 instr*%i*ne 6n
else instr*%ti*ne 6n@<
Sintaxe alternative
Dac dorim s se execute mai multe instruciuni cnd este indeplinit o anumit condiie,
atunci ar trebui s folosim instruciunile compuse. De exemplu, pentru o structur if vom
scrie:
i& /%on,itie0!
instr*%ti*ne 6<
instr*%ti*ne 6= ...
instr*%ti*ne 6n
en,i&
Practic, pentru orice structur de control PHP, putem nlocui acolada deschisa prin caracterul
':' i acolada nchis printr-un cuvnt cheie opinut prin adugarea prefixului end la cuvntul
cheie care indic structura de control. Trebuie observat faptul c else i elseif nu sunt
structuri, ele fiind simple construcii folosite n cadrul structurii if. Din acest motiv, nu vom
avea niciodat endelse sau endelseif, ci doar endif-uri. Aadar, sintaxa alternativ pentru o
structur if n care se folosesc construcii else i elseif este urmtoarea:
i& /%on,itie 6<0
gr*p instr*%ti*ni 6<
elsei& /%on,itie 6=0
gr*p instr*%ti*ni 6=
elsei& ...
elsei& /%on,itie 6n0
gr*p instr*%ti*ni 6n
else gr*p instr*%ti*ni 6n@<
en,i&E
Structura while
Majoritatea script-urilor PHP vor conine cicluri. Pentru a folosi o bucl anterior condiionat
vom utiliza structura *hile. Sintaxa acestei proceduri este:
9hile /%on,itie0 instr*%ti*ne
Efectul acestei structuri este executarea instruciunii att timp ct valoarea expresiei condiie
(eventual dup conversia la tipul boolean) este tr*e. Trebuie observat faptul c este posibil ca
instruciunea s nu fie executat niciodat. Si pentru aceast structur avem la dispoziie o
sintax alternativ i anume:
9hile /%on,itie0!
gr*p instr*%ti*ni
en,9hileE
Structura do - while
Uneori, dorim s folosim bucle posterior condiionate. n acest scop, n PHP avem la dispoziie
structura do ) *hile a crei sintax este:
,o instr*%ti*ne 9hile /%on,itie0E
Singura diferen fa de structura while este faptul c valoarea condiiei este determinat, de
fiecare dat, dup executarea instruciunii. Ca urmare, instruciunea va fi executat cel puin o
dat. Nu exist o sintax alternativ pentru aceast structur.
+tructura for
O alternativ cu o funcionalitate mai ridicat pentru utilizarea buclelor este structura
repetitiv for. Sintaxa este foarte asemntoare cu cea din limbajele C/C++ i Java i anume:
&or /e#presie 6<E e#presie 6=E e#presie 6B0
instr*%ti*ne
Prima expresie este evaluat o singur dat, nainte de nceperea execuiei ciclului.
Instruciunea este executat ct timp cea de-a doua expresie are valoarea tr*e. De fiecare
dat, dup executarea instruciunii, este evaluat cea de-a treia expresie. Oricare dintre cele
trei expresii poate lipsi; n cazul n care o expresie lipseste, se consider c ea are valoarea
tr*e. Pentru structura for poate fi folosit i urmtoarea sintax alternativ:
&or /e#presie 6<E e#presie 6=E e#presie 6B0!
instr*%ti*ne
en,&orE
Exemple
n continuare avei un exemplu care afieaz numerele cuprinse ntre 1 i 15. Numerele pare
vor fi scrise cu rou, iar cele impare care sunt divizibile cu 3 cu verde, iar celelalte cu albastru.
Vom folosi o structur repetitiv pentru a afia numerele i o structur alternativ pentru a
determina culoarea cu care vor fi afiate. Putem utiliza oricare dintre cele trei structuri
repetitive; codul PHP pentru cele trei variante este prezentat mai jos.
Cod:
<?php
// Structuri alternative si repetitive
// Bucla for
// Exemplu
for ($i = 1; $i <= 15; $i++):
echo "<b><font size = 3 ";
echo "color = ";
if ( ! ($i % 2))
echo "red";
elseif ( ! ($i % 3))
echo "green";
else
echo "blue";
echo "> $i </font></b>";
endfor;
?>
Cod:
<?php
// Structuri alternative si repetitive
// Bucla while
// Exemplu
$i = 1;
while ($i<=15)
{
echo "<b><font size = 3 ";
echo "color = ";
if ( ! ($i % 2))
echo "red";
elseif ( ! ($i % 3))
echo "green";
else
echo "blue";
echo "> $i </font></b>";
$i++;
}
?>
Cod:
<?php
// Structuri alternative si repetitive
// Bucla do - while
// Exemplu
$i = 1;
do
{
echo "<b><font size = 3 ";
echo "color = ";
if ( ! ($i % 2))
echo "red";
elseif ( ! ($i % 3))
echo "green";
else
echo "blue";
echo "> $i </font></b>";
$i++;
}
while ($i <= 15);
?>
Rezultat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Structura foreach
Aceast structur poate fi folosit pentru a realiza o iteraie printre toate elementele unui
vector. Aadar, ea nu poate fi folosit dect mpreun cu vectorii; utilizarea sa asupra unei
variabile de alt tip duce la apariia de erori. Exist dou sintaxe acceptate pentru aceast
structur i anume:
&orea%h /e#presie_Ce%toriala as $Caloare0
instr*%ti*ne
sau
&orea%h /e#presie_Ce%toriala as $%heie =N $Caloare0
instr*%ti*ne
Dac se utilizeaz prima variant, atunci la fiecare iteraie valoarea elementului curent este
atribuit variabilei $Caloare i apoi se trece la elementul urmtor (a crui valoare va fi
atribuit variabilei la urmtoarea iteraie). Execuia ciclului se ncheie n momentul n care nu
mai exist alte elemente n vector. Singura diferena care apare n cazul utilizrii celei de-a
doua variante este faptul c la fiecare iteraie valoarea cheii elementului curent este atribuit
variabilei $%heie. n continuare este un exemplu de folosire a celor doua sintaxe ale structurii
foreach.
Cod:
<?php
// structura foreach
echo '<table width="100%"><tr><td with="50%">';
// un vector obisnuit
$a = array (1, 2, 3, 10);
echo "<b>Parcurgerea unui vector:</b><br><ol>";
foreach ($a as $v)
echo "<li><i>Valoarea curenta este </i>:<tt>$v</tt>\n<br>";
/* parcurgerea vectorului, contorizarea elementelor si afisarea num
arului de ordine al elementului curent */
$i = 0;
echo "</ol><b>O alta parcurgere: </b><ul>";
foreach ($a as $v)
{
echo "<li><tt>\$a[$i] => $v</tt>\n <br>";
$i++;
}
/* un vector ale carui elemente sunt identificate prin chei */
$a = array
(
"unu" => 1,
"doi" => 2,
"trei" => 3,
"zece" => 10
);
echo "</ul><td><width = 50%><b>Parcurgere cu afisarea cheilor: </b><ul>"
;
foreach ($a as $k => $v)
{
echo "<li><tt>\$a[$k] => $v</tt>\n";
}
// o matrice
$b[0][0] = "a";
$b[0][1] = "b";
$b[1][0] = "c";
$b[1][1] = "d";
echo "</ul><b>Parcurgerea unei matrice:</b><br><tt>";
foreach ($b as $v1)
{
echo "&nbsp;&nbsp;";
foreach ($v1 as $v2)
echo "$v2\n";
echo "<br>";
}
echo "</tt><br><b>Parcurgerea unui vector generat dinamic: </b><br><tt>
&nbsp;&nbsp;";
// un vector generat dinamic
foreach (array (1, 2, 3, 4, 5) as $v)
echo "$v\n";
echo "</tt></td></tr></table>";
?>
Rezultatul codului de mai sus este:
Parcurgerea unui vector:
1. Valoarea %*renta este :1
2. Valoarea %*renta este :2
3. Valoarea %*renta este :3
4. Valoarea %*renta este :10
O alta parcurgere:
$a[0] => 1
$a[1] => 2
$a[2] => 3
$a[3] => 10
Parcurgere cu afisarea cheilor:
$a[unu] => 1
$a[doi] => 2
$a[trei] => 3
$a[zece] => 10
Parcurgerea unei matrice:
a b
c d
Parcurgerea unui vector generat dinamic:
1 2 3 4 5
Structura switch
n anumite cazuri trebuie s efectum anumite operaii n funcie de anumite valori ale unei
expresii. O soluie ar fi folosirea unor structuri if mbricate sau a uneia singure n care apar
mai multe construcii elseif.
S presupunem c o anumit variabil poate avea cinci valori distincte i pentru fiecare
valoare trebuie executat o anumit instruciune. Dac folosim structura if, secvena de cod
va fi urmtoarea:
i& /$Cariabila == Caloare 6<0
instr*%ti*ne 6<
elsei& /$Cariabila == Caloare 6=0
instr*%ti*ne 6=
elsei& /$Cariabila == Caloare 6B0
instr*%ti*ne 6B
elsei& /$Cariabila == Caloare 6O0
instr*%ti*ne 6O
else
instr*%ti*ne 6J
Folosind structura s*itch, secvena echivalent este:
s9i%h /$Cariabila0 H
%ase Caloare 6<! instr*%ti*ne 6<
brea)E
%ase Caloare 6=! instr*%ti*ne 6=
brea)E
%ase Caloare 6B! instr*%ti*ne 6B
brea)E
%ase Caloare 6O! instr*%ti*ne 6O
brea)E
%ase Caloare 6J! instr*%ti*ne 6J
brea)E
I
Prezentm n continuare sintaxa general a structurii s*itch:
s9it%h /e#presie0 H
%ase Caloare 6<! gr*p instr*%ti*ni 6<
%ase Caloare 6=! gr*p instr*%ti*ni 6=
...
%ase Caloare 6n! gr*p instr*%ti*ni 6n
[,e&a*lt! gr*p instr*%ti*ni 6n @ <
I
Pentru nceput se determin valoarea expresiei i apoi se verific dac aceasta apare ca
valoare pentru una dintre construciile case. n caz afirmativ, toate instruciunile ncepnd cu
cea corespunztoare valorii respective (pn la sfritul blocului s*ich) vor fi executate.
Execuia acestor instruciuni poate fi ntrerupt dac este folosit instruciunea brea,, care va
fi prezentat mai jos. Dac valoarea expresiei nu corespunde nici uneia dintre valorile
corespunztoare construciilor case, se execut instruciunile corespunztoare construciei
default. Dac aceasta lipseste, atunci nu se execut nici o instruciune. Trebuie precizat faptul
c valorile corespunztoare construciilor case pot fi numere ntregi, numere reale sau iruri
de caractere; nu pot fi utilizate obiecte sau vectori.
Instruciunea break
Aceast instruciune poate fi folosit pentru a ntrerupe forat execuia unui ciclu sau a
secvenei de instruciuni corespunztoare unei structuri s*itch. Instruciunea poate fi urmat
de un argument care indic numrul de structuri mbricate a cror execuie se ncheie.
Valoarea implicit este 1, deci se ntrerupe execuia unei singure structuri. Urmtoarea
secven de cod PHP realizeaz parcurgerea elementelor unui vector de numere ntregi pn n
momentul n care se ntlnete un numr negativ.
Cod:
<?php
foreach ($a as $v)
if ($v < 0)
break;
?>
Mai departe avei cazul n care este ntrerupt execuia mai multor cicluri; vom considera c
parcurgem elementele unei matrice ptratice cu n elemente i n coloane pn n momentul n
care ntlnim o valoare nul.
Cod:
<?php
for ($i = 0; $i < $n; $i++)
for ($j = 0; $j < $n; $j++)
if ( ! $a [$i] [$j] )
break 2;
?>
Instruciunea brea, poate fi utilizat pentru ntreruperea execuiei secvenelor de instruciuni
corespunztoare structurilor for, foreach, *hile, do ) *hile i s*itch.
Instruciunea continue
Aceast instruciune este folosit pentru a ntrerupe execuia secvenei de instruciuni din
interiorul unui ciclu i trecerea la urmtoarea iteraie. n cazul instruciunii for, nainte de
urmtoarea iteraie se evalueaz (execut) expresia de incrementare (expresia #3 din sintaxa
general). La fel ca i n cazul instruciunii brea,, poate aprea un argument care indic
numrul structurilor mbricate asupra crora are efect. Exemplul urmtor realizeaz afiarea
elementelor unui ir de numere ntregi care sunt mai mari dect 1000.
Cod:
<?php
foreach ($a as $v)
{
if ($v <= 1000)
continue;
echo $v;
}
?>
Urmtorul exemplu ilustreaz efectul folosirii argumentelor pentru instruciunea continue.
Cod:
<?php
$i = 0;
while ($i++ <5)
{
echo "Ciclul #1 <br>\n";
while (1)
{
echo "??Ciclul #2 <br>\n";
while (1)
{
echo "??Ciclul #3<br>\n";
continue 3;
}
echo "Acest mesaj nu va fi afisat niciodata.<br>\n";
}
echo "Nici acest mesaj nu va fi afisat niciodata.<br>\n";
}
?>
Rezultatul codului de mai sus este:
Ciclul #1
Ciclul #2
Ciclul #3
Ciclul #1
Ciclul #2
Ciclul #3
Ciclul #1
Ciclul #2
Ciclul #3
Ciclul #1
Ciclul #2
Ciclul #3
Ciclul #1
Ciclul #2
Ciclul #3
Alte structuri PHP
Exist mai multe alte structuri PHP care pot fi utilizate n anumite scopuri. Vom aminti acum
cteva dintre ele:
Structurile include, re-uire, include.once i re-uire.once pot fi utilizate pentru a "insera"
anumite instruciuni care sunt pstrate ntr-un alt fiier (document). Interpretorul PHP
consider c secvena din fiierul inserat se afl n fiierul din care s-a "comandat" inserarea
n poziia n care apare structura de inserare.
O alt structur este declare care permite crearea unor directive n execuie.
Funciile PHP trebuie s utilizeze instruciunea return pentru a furniza un rezultat.
Despre funcii n PHP
n PHP funciile pot fi definite de ctre utilizator folosind urmtoarea sintax:
&*n%tion n*$e& /$para$<. $para$=. .... $para$N0 H
"" instr*%ti*ni
I
n PHP o funcie poate fi definit oriunde n cadrul script-ului i n interiorul unei funcii poate
s apar orice secven valid de cod care include definirea de alte funcii i definiii de clase.
Argumentele unei funcii trebuie separate prin virgul, i, implicit, acestea sunt transmise prin
valoare. Pentru ca funcia s returneze un rezultat se folosete construcia return care
primete ca parametru o expresie care reprezint valoarea funciei. n momentul n care este
ntlnit construcia return, execuia funciei se ncheie. n exemplul urmtor se calculeaz cu
ajutorul unei funcii PHP, ptratul unui numr.
Cod:
<?php
function patrat($n)
{
return $n * $n;
}
echo "4^2=<b>".patrat(4)."</b>";
?>
Rezultatul codului va fi:
4^2=16
Transmiterea parametrilor prin referin
Pentru a transmite parametri unei funcii prin referin, fapt care implic modificarea valorii
parametrilor i pstrarea noii valori dup ce execuia funciei s-a ncheiat, se folosete
operatorul 'P' naintea numelui parametrului formal, n momentul definirii funciei. Urmtorul
exemplu indic modul n care se modific valoarea unei variabile n interiorul unie funcii i
modul n care aceast modificare este resimit n exteriorul acesteia:
Cod:
<?php
function modificInt ($s)
{
$s .= " prima functie.";
echo "<b>In modificInt: </b>".$s."<br>";
}
function modificExt (&$s)
{
$s .= " a doua functie.";
echo "<b>In modificExt: </b>".$s."<br>";
}
$s="Iesire din ";
echo "<b>In script: </b>".$s."<br>";
modificInt ($s);
echo "<b>In script: </b>".$s."<br>";
modificExt ($s);
echo "<b>In script: </b>".$s."<br>";
?>
Rezultat:
In script: Iesire din
In modificInt: Iesire din prima functie.
In script: Iesire din
In modificExt: Iesire din a doua functie.
In script: Iesire din a doua functie.
Nu exist posibilitatea de suprancrcare a unei funcii, de redefinire a ei dup ce aceasta a
fost definit n cadrul scriptului respectiv i nu exist nici posibilitatea de anulare a unei funcii.
Parametri cu valori implicite
n PHP parametrii formali pot avea valori implicite, i, n cazul n care parametrul actual
lipsete, atunci se va considera c are valoarea implicit. Urmtorul exemplu ilustreaz modul
de folosire al funciilor cnd acestea au parametri formali cu valori implicite:
Cod:
<?php
function comanda($s='cafea')
{
return "Ati comandat ".$s.".";
}
echo comanda();
echo "<br>";
echo comanda("suc");
?>
Rezultat:
Ati comandat cafea.
Ati comandat suc.
n cazul n care se folosesc parametri cu valori implicite este necesar ca orice parametru care
are o valoare implicit s se afle n partea dreapt a tuturor parametrilor pentru care nu se
folosesc valori implicite, n caz contrar interpretorul PHP nu poate s decid crui parametru
s-i atribuie valoarea de pe o anumit poziie din lista de parametri. De exemplu, dac avem o
funcie a crei declaraie este
function trans&or$ /$ba;a=<Q. $nr0
si care returneaz rezultatul transformrii lui $nr din baza 16 n baza $ba;a, a crei valoare
implicit este 10, dac se apeleaza trans&or$ /JQ0, interpretorul nu atribuie valoarea 50
parametrului $nr, ci parametrului $ba;a i genereaz o eroare deoarece lipseste valoarea
parametrului $nr.
Funcii cu numr variabil de parametri
O alt facilitate a limbajului PHP este aceea c ofer programatorului posibilitatea de a utiliza
funcii care au un numr nedeterminat de parametri. Funciile care folosesc un numr variabil
de parametri nu au nici o particularitate n ceea ce privete definirea lor. Aceste funcii se
definesc la fel ca cele prezentate anterior, dar pentru a putea accesa parametri se vor folosi
urmtoarele funcii predefinite:
- func.num.args/ 0 - aceast funcie returneaz numrul parametrilor funciei care a
apelat-o; dac aceast funcie este apelat din exteriorul unei funcii definite de utilizator se
va genera un mesaj de avertizare;
- func.get.arg/arg.num0 - returneaz valoarea parametrului care se afl pe pozitia
arg.num n lista de parametri; primul parametru are numrul de ordine 0; dac este apelat
din exteriorul unei funcii definite de utilizator se va genera un mesaj de avertizare;
- func.get.args/ 0 - returneaz un tablou unidimensional care conine valorile parametrilor
pe care funcia apelant i-a primit; dac aceast funcie este apelat din exteriorul unei funcii
definite de utilizator se va genera un mesaj de avertizare.
n continuare avei 2 exemple de utilizare a acestor funcii. Primul exemplu afieaz lista
parametrilor funciei folosind funcia func.num.argsi func.get.arg, iar al doilea exemplu
afieaz aceeai list folosind numai funcia func.get.args.
Cod:
<?php
function lista_parametri()
{
for ($i=0; $i<func_num_args(); $i++)
{
print_r(func_get_arg($i));
echo "<br>";
}
}
echo lista_parametri("Comanda:", 1, "calculator", 2, "procesoare", "con
figuratie", array("local", 2, 3));
?>
Cod:
<?php
function lista_parametrii()
{
foreach(func_get_args() as $i)
{
print_r ($i);
echo "<br>";
}
}
echo lista_parametrii ("Comanda:", 1, "calculator", 2, "procesoare", "c
onfiguratie", array("local", 2, 3));
?>
Rezultat:
Comanda:
1
calculator
2
procesoare
configuratie
Array ( [0] => local [1] => 2 [2] => 3 )
Valorile returnate de funcii
Rezultatul obinut dup apelarea unei funcii poate avea orice tip. O funcie poate s returneze
chiar i liste sau obiecte. n PHP exist un caz special de rezultat numit referin. Pentru ca o
funcie s poat returna o referin, aceasta trebuie declarat folosindu-se operatorul 'P'
naintea numelui funciei. Acest operator trebuie s apar naintea numelui funciei i n
momentul cnd o variabil primete ca valoare referina rezultat din apelul funciei. n
exemplul urmtor se definete o funcie al crui rezultat l constituie o referin:
Cod:
<?php
function &refer()
{
global $s;
return $s;
}
$s = "Acesta este continutul variabilei referite cu ajutorul functiei.";

$z = &refer();
echo $z;
?>
Rezultat:
Acesta este continutul variabilei referite cu ajutorul functiei.
Spre deosebire de majoritatea limbajelor de programare moderne, o funcie PHP poate s
returneze o referin la o variabil care a fost declarat n interiorul funciei, ns acest lucru
nu este indicat deoarece, n anumite cazuri, poate duce la efecte neateptate ale executrii
unui script PHP. n alte limbaje de programare efectele devin uneori fatale.
Variabilele de tip funcie
O alt facilitate a limbajului PHP n ceea ce privete funciile este aceea c suport variabile de
tip funcie. Acest lucru este util atunci cnd se folosesc liste de funcii pentru prelucrarea
anumitor tipuri de date. Pentru a atribui un nume de funcie unei variabile n PHP se folosete
aceeai construcie ca n cazul atribuirii unui ir de caractere, i anume, o variabil va primi ca
valoare numele funciei scris ntre ghilimele simple sau duble. n cazul n care interpretorul
PHP gsete un nume de variabil urmat de o list de parametri, acesta caut funcia pe care
variabila o refer i n cazul n care exist, o execut. Variabilele de tip funcie nu funcioneaza
cu construcii ale limbajului ca echo, unset, isset, empty, include etc. Mai jos avei un
exemplu care ilustreaz modul de lucru cu variabilele de tip funcie.
Cod:
<?php
function produs($a, $b)
{
return $a * $b;
}
function suma($a, $b)
{
return $a + $b;
}
$operatie = 'produs';
$rez = $operatie(4, 5);
echo "4 * 5 = <b>".$rez."</b><br>";
$operatie = 'suma';
$rez = $operatie(4, 5);
echo "4 + 5 = <b>".$rez."</b><br>";
?>
Rezultat:
4 * 5 = 20
4 + 5 = 9
Clase i obiecte n PHP
O clas este o colecie de variabile i funcii care opereaz asupra variabilelor respective.
Sintaxa folosit pentru declararea unei clase n PHP este:
Cod:
<?php
class nume_clasa
{
// date membre
var nume_variabila_1
...
var nume_variabila_m
// metode
function nume_functie_1 (parametri)
{
... // definitia functiei
}
...
function nume_functie_n (parametri)
{
... // definirea functiei
}
}
?>
Pentru numele unei clase poate fi utilizat orice identificator permis n PHP cu o singur
excepie: sdtclass; acest identificator este folosit de PHP n scopuri interne.
n PHP funciile ale cror identificatori ncep cu _ sunt considerate funcii magice i utilizarea
acestora nu este recomandat.
n PHP, datele membre nu pot fi iniializate dect cu valori constante. Pentru a iniializa
variabilele cu valori care nu sunt constante trebuie folosit un constructor. Mai jos aveti un
exemplu de clas n care initializrile nu sunt corecte:
Cod:
<?php
class Nepermis
{
var $data = date("Y-m-d");
var $nume = $prenume;
var $dest = 'Mihai '.'Claudiu';
var $obiecte = array ("minge", "pantof");
}
?>
Obiecte
n PHP clasele sunt considerate a fi tipuri de date; ele pot fi privite ca fiind "amprentele"
variabilelor propriu-zise. Pentru a crea o variabil al crei tip este o clas trebuie utilizat
operatorul new. n continuare vom defini o clas 1ritmetica cu dou date membre x i y care
sunt numere ntregi i dou metode care realizeaz adunarea, respectiv nmulirea lor.
Cod:
<?php
class Aritmetica
{
var x = 2;
var y = 3;
function Suma ()
{
return $this -> x + $this -> y;
}
function Produs()
{
return $this -> x * $this -> y;
}
}
?>
Pentru a crea un obiect de tipul 1ritmetica vom utiliza o instruciune de tipul:
$arit$ = ne9 Arit$eti%aE
Acum putem utiliza metodele clasei; pentru a afia suma sau produsul celor dou numere vom
putea apela cele dou metode astfel:
e%ho $arit$ RN S*$a / 0E
e%ho $arit$ RN Pro,*s / 0E
Vom obine rezultatele 5, respectiv 6. Valorile datelor membre pot fi i ele modificate prin
instruciuni de tipul:
$arit$ RN # = JE
$arit$ RN 3 = OE
Dac, n urma modificrii apelam din nou metodele +uma/ 0 i 2rodus/ 0, rezultatele vor fi 9,
respectiv 20.
Cod:
<?php
class PHP4
{
var $salut = "Salut PHP4!";
function Salut()
{
return $this -> salut;
}
}
$salutare = new PHP4;
echo $salutare -> Salut()."<br>";
?>
Rezultatul codului de mai sus este:
Sal*t PHPO7
n acest exemplu a fost utilizat pseudo-variabila 'this. Aceasta este folosit pentru a indica
faptul c se opereaz asupra unei date membre a obiectului curent.
Extinderea claselor
Deseori este necesar definirea unor clase cu proprieti (date membre) i metode
asemntoare. Pentru a usura definirea unor astfel de clase a fost introdus conceptul de
extindere (derivare) a claselor.
O clas derivat va pstra toate proprietile i metodele clasei pe care o extinde i poate
conine diferite proprieti i metode noi. Nu exist nici o posibilitate de a elimina din clasa
derivat anumite proprieti sau metode ale clasei de baz. O anumit clas poate avea o
singur clas printe; aadar, n PHP nu este permis motenirea multipl. Pentru a extinde
o anumit clas se utilizeaz cuvntul cheie etends.
q urmtorul exemplu voi extinde clasa Arit$eti%a; o s adaug nc o variabil i o s crez dou
noi funcii: una pentru calculul sumei celor trei variabile i una pentru calcularea produsului
lor:
Cod:
<?php
class Aritmetica3 extends Aritmetica
{
var z = 4;
function Suma3()
{
return $this -> x + $this -> y + $this -> z;
}
function Produs3()
{
return $this -> x * $this -> y * $this -> z;
}
}
?>
Dac definim un obiect prin intermediul unei instruciuni de genul:
$arit$B = ne9 Arit$eti%aBE
atunci pentru acest obiect vom putea utiliza att metodele definite n cadrul clasei
Arit$eti%aB! S*$aB/ 0i Pro,*sB/ 0, ct i metodele definite n cadrul clasei de baz
Arit$eti%a! S*$a/ 0i Pro,*s/ 0.
n continuare avei un exemplu care ilustreaz modul n care pot fi create i utilizate clasele
derivate.
Cod:
<?php
class Aritmetica
{
var $x = 2;
var $y = 3;
function Suma()
{
return $this -> x + $this -> y;
}
function Produs()
{
return $this -> x * $this -> y;
}
}
class Aritmetica3 extends Aritmetica
{
var $z = 4;
function Suma3()
{
return $this -> x + $this -> y + $this -> z;
}
function Produs3()
{
return $this -> x * $this -> y * $this -> z;
}
}
$aritm3 = new Aritmetica3;
echo "<b>Inainte de modificare.</b>";
echo "<br>";
echo "Suma primelor doua numere: ";
echo $aritm3 -> Suma()."<br>";
echo "Produsul primelor doua numere: ";
echo $aritm3 -> Produs()."<br>";
echo "Suma celor trei numere: ";
echo $aritm3 ->Suma()."<br>";
echo "Produsul celor trei numere: ";
echo $aritm3 -> Produs()."<br>";
$aritm3 -> x = 5;
$aritm3 -> y = 4;
$aritm3 -> z = 3;
echo "<br><br>";
echo "<b>Dupa modificare.</b><br>";
echo "<br>";
echo "Suma primelor doua numere: ";
echo $aritm3 -> Suma3()."<br>";
echo "Produsul primelor doua numere: ";
echo $aritm3 -> Produs3()."<br>";
echo "Suma celor trei numere: ";
echo $aritm3 -> Suma3()."<br>";
echo "Produsul celor trei numere: ";
echo $aritm3 -> Produs3()."<br>";
?>
Rezultatul codului de mai sus este:
Citat:
Inainte de modificare.
Suma primelor doua numere& '
(rodusul primelor doua numere& )
Suma celor trei numere& '
(rodusul celor trei numere& )
Dupa modificare.
Suma primelor doua numere& *+
(rodusul primelor doua numere& ),
Suma celor trei numere& *+
(rodusul celor trei numere& ),
n PHP clasele trebuie definite naintea utilizrii lor; aadar clasa printe va fi definit
ntotdeauna naintea clasei fiu.
Constructori
Un constructor este o metod (funcie) a unei clase care este apelat automat n momentul n
care este creat o nou instan a clasei (cu ajutorul operatorului new). n PHP, este
considerat ca fiind un constructor, orice funcie care are acelai nume cu clasa n interiorul
creia este definit.
Constructorii pot fi folosii pentru iniializarea datelor membre cu valori care nu sunt
constante. Ei pot avea argumente, iar acestea pot fi optionale. Pentru a putea utiliza clasa fr
a specifica nici un parametru n momentul crerii unui obiect, se recomand stabilirea unor
valori implicite pentru toate argumentele constructorului. n cazul n care nu este definit un
constructor pentru o anumit clas, se utilizeaz constructorul clasei de baz, dac aceasta
exist. De exemplu, pentru urmtoarea secven de cod, n momentul crerii obiectului
corespunztor variabilei 'b, va fi apelat constructorul clasei 1.
Cod:
<?php
class A
{
function A()
{
echo "Constructorul clasei A<br>";
}
function B()
{
echo "O functie obisnuita a clasei A.<br>";
}
}
class B extends A
{
function C()
{
echo "O functie obisnuita a clasei B.<br>";
}
}
?>
n PHP apelul constructorului clasei de baz trebuie s fie explicit dac este necesar
executarea operaiilor corespunztoare. n majoritatea limbajelor de programare exist funcii
speciale numite destructori care sunt apelate automat n momentul "distrugerii" unui obiect. n
PHP nu exist destructori.
Operatorul ::
Uneori este util folosirea unor metode sau variabile ale clasei de baz sau ale unei clase care
nu a fost instaniat nc. n acest scop a fost introdus operatorul ::
Pentru a descrie modul de utilizare al acestui operator voi prezenta mai nti un exemplu:
Cod:
<?php
class A
{
function exemplu()
{
echo "Functia clasei de baza. <br>";
}
}
class B extends A
{
function exemplu()
{
echo "Functia redefinita<br>\n";
A :: exemplu();
}
}
A :: exemplu();
$b = new B;
$b -> exemplu();
$b = new B;
?>
Prin intermediul instruciunii
A !! e#e$pl*/ 0E
este apelat metoda e#e$pl*/ 0 a clasei A, aadar se afieaz mesajul 'F*n%tia %lasei ,e ba;a'
cu toate c nu exist nici un obiect care este o instan a acestei clase, deci nu putem scrie o
instruciune de tipul $a RN e#e$pl*/ 0E
n schimb apelm metoda
$b RN e#e$pl*/ 0E
ca "o funcie a clasei" i nu ca "o funcie a unui obiect". Putem avea funcii ale claselor, dar nu
putem avea variabile ale claselor. De fapt, n momentul unui astfel de apel nu se creeaza nici
un obiect care este instan a clasei respective. Ca urmare, o funcie a unei clase nu poate
opera asupra unor proprieti ale clasei, dar poate utiliza variabile locale sau globale. n plus,
o astfel de funcie nu poate utiliza pseudo-variabila $this.
n exemplul anterior, n cadrul clasei 3 este redefinit funcia e#e$pl*/ 0. Aadar, definiia
"original" (din cadrul clasei 1) nu poate fi accesat n interiorul clasei B dect dac ne referim
la ea explicit prin intermediul operatorului ::.
Accesarea clasei de baza
n exemplul anterior am utilizat o funcie a clasei de baz. n locul utilizrii denumirii clasei de
baza poate fi folosit denumirea special parent care este o referin la clasa de baz definit
n cadrul construciei e#ten,s. Folosirea denumirii speciale este util n cazul n care ierarhia
de clase se modific. n acest caz este suficient o singur modificare n cadrul construciei
e#ten,s, fr a mai fi necesare modificri n interiorul clasei derivate. Aadar, definiia clasei 3
poate fi rescris astfel:
Cod:
<?php
class B extends A
{
function exemplu()
{
echo "Functia redefinita<br>\n";
parent :: exemplu();
}
}
?>
Serializarea obiectelor
Prin serializare se nelege crearea unui ir de octei care conin reprezentarea intern (binar)
a variabilei respective. Aadar, serializarea permite "salvarea" valorilor unei variabile. Dac
este serializat un obiect sunt salvate doar proprietile acestuia (variabilele membre) i
numele clasei din care face parte, nu i metodele, deoarece funciile nu reprezint valori.
Pentru a serializa un obiect este utilizat funcia seriali4e/ 0 care returneaz irul de octei
care conine reprezentarea binar.
Pentru a deserializa un obiect se folosete funcia pereche unseriali4e/ 0.
Pentru ca o astfel de operaie s funcioneze corect este necesar definirea clasei din care face
parte obiectul respectiv. Funcia returneaz valoarea variabilei serializate. n exemplul
urmtor avei prezentat modul n care poate fi serializat i deserializat un obiect. irul de
octei obinut n urma serializrii va fi scris ntr-un fiier i va fi citit din fiierul respectiv
pentru efectuarea deserializrii. De obicei serializarea i deserializarea sunt realizate n
documente php diferite deoarece aeste operaii nu au aproape nici o utilitate dac sunt folosite
n cadrul aceluiai document. Primul document n care se realizeaz serializarea trebuie s
conin o secven asemntoare cu urmtoarea:
Cod:
<?php
class A
{
var $msg = "Salutare lume";
function scrie()
{
echo $this -> msg;
}
}
$a = new A;
$s = serialize ($a);
// salvarea sirului intr-un fisier
$fp = fopen ("fisier", "w");
fputs ($fp, $s);
fclose ($fp);
?>
Pentru deserializare al doilea document va conine urmtoarea secven:
Cod:
<?php
class A
{
var $msg = "Salutare lume";
function scrie()
{
echo $this -> msg;
}
}
// citirea sirului din fisier
$s = implode ("", @file ("fisier"));
$a = unserialize ($s);
// dupa deserializare obiectul poate fi folosit
$a -> show_one();
?>
Referinele pot fi utilizate pentru a accesa coninutul unei variabile folosind mai multe nume.
Spre deosebire de limbajul C, n PHP referinele nu sunt pointeri, ci alias-uri ntr-o tabela de
simboluri. n PHP denumirile variabilelor i coninutul acestora nu sunt unul i acelai lucru.
Aadar este posibil ca acelai coninut s aib denumiri diferite.
Utilizarea referinelor
Referinele PHP permit unor variabile cu denumiri diferite s corespund unui acelai coninut.
Cu alte cuvinte, instruciunea
$a = P$b
are ca efect faptul c 'a i 'b refer aceeai variabil. n aceast situaie 'a i 'bSE"e$N a*
a%elaTi stat*t. N* se poate sp*ne %U 'a re&erU 'b sa* inCers. O altU posibilitate ,e *tili;are a
re&erin8elor este trans$iterea prin re&erin8U a para$etrilor *nei &*n%8ii. E&e%t*l *nei ast&el ,e
trans$isii este %rearea *nei Cariabile lo%ale %are re&erU spre a%elaTi %on8in*t %a Cariabila ,in
%onte#t*l apelant. SU l*U$ Vn %onsi,erare *r$Utor*l e#e$pl*!
Cod:
<?php
function inc(&$var)
{
$var++;
}
$a = 5;
inc($a);
?>
-ni8ial Caloarea Cariabilei 'a este J. (*pU apel Cariabila lo%alU $Car Ti Cariabila ,in %onte#t*l
apelant 'a in,i%U spre a%elaTi %on8in*t. Valoarea pUstratU Vn lo%a8ia ,e $e$orie respe%tiCU
este in%re$entatU /,eCine L0 prin inter$e,i*l instr*%8i*nii $Car@@E.
(atoritU &apt*l*i %U %ele ,o*U Cariabile a* a%elaTi %on8in*t. Caloarea Cariabilei 'a Ca &i L ,*pU
e#e%*tarea &*n%8iei.
5n para$etr* trans$is prin re&erin8U poate &i!
R o CariabilUE
R o instr*%8i*ne ne*E
R o re&erin8U ret*rnatU ,e o &*n%8ie.
(a%U *nei ast&el ,e &*n%8ii i se trans$ite %a para$etr* *n alt tip ,e e#presie re;*ltat*l este
ne,e&init. ATa,ar. pentr* o &*n%8ie %are are *n para$etr* trans$is prin re&erin8U n* se poate
&olosi o %onstantU Vn $o$ent*l apel*l*i. (e e#e$pl*. pentr* &*n%8ia in%/ 0 pre;entatU anterior
n* este per$is *n apel ,e &or$a in%/J0.
5eferine globale
Wn $o$ent*l ,e%larUrii *nei Cariabile globale /printrRo instr*%8i*ne ,e tip*l global $Car0 se
%reea;U ,e &apt o re&erin8U spre o CariabilU globalU. :* alte %*Cinte. a%eastU instr*%8i*ne este
e%hiCalentU %* $Car = P$1LO2ALS [>Car>E.
5eferina 'this
Wn %a,r*l *nei $eto,e a *n*i obie%t 'this este Vntot,ea*na o re&erin8U spre obie%t*l %are
*tili;ea;U &*n%8ia /obie%t*l %*rent0.
Crearea imaginilor thumbnails
Acest tutorial v va nva cum s creai thumbnail-uri ale unor imagini mai mari ca
dimensiune. Thumbnail-urile sunt nite imagini n miniatur de o rezoluie mai mic. Odat
apsat un thumbnail vom deschide poza original. S vedem n continuare cum vom face
acest lucru posibil. n primul rnd avem nevoie de dou foldere: unul pentru imaginile
originale, i l vom denumi pictures i unul pentru thumnail-uri pe care l vom denumi
thumbnails. Ceea ce este foarte important este c n aceste dou foldere nu trebuie s se
gseasc dect imagini de tip JPG altfel vom ntmpina erori. Este evident c putem adapta
scriptul pentru orice format de imagine, GIF sau PNG ns scopul principal al acestui tutorial
este acela de a v face s ntelegei care sunt paii pe care trebuie sa i urmai cnd facei un
asemenea script.
PHP-ul pe care l rulai trebuie s aib activat libraria GD2 pentru a rula acest script, altfel
vei ntmpina o eroare prin care v va fi adus la cunotin c funcia pentru imagini nu poate
fi gsit. Dac librria GD2 nu este activ o putei activa n felul urmtor n mediul WINDOWS:
adugai liniile urmtoare n php.ini:
e#tension=php_g,=.,ll
Vom deschide directorul pictures i thumbnails i vom citi numele fiecrui fiier care exist
n aceste directoare i le vom memora n vectorul $pi%t*res i $th*$bnails
Cod:
<?php
$open_pictures = opendir("pictures");
while($file = readdir($open_pictures))
{
if(substr($file, 0, 1) != '.')
{
$pictures[] = $file;
}
}
closedir($open_pictures);
$open_thumbnails = opendir("thumbnails");
while($file = readdir($open_thumbnails))
{
if(substr($file, 0, 1) != '.')
{
$thumbnails[] = $file;
}
else
{
$thumbnails = array();
}
}
closedir($open_thumbnails);
?>
Vom reine apoi n dou variabile de tip vector numele pozelor care se afl n folderul pictures
dar nu se afl n folderul thumbnails, ct i pozele care se afl n folderul thumbnails dar nu
se afla n folderul pictures. Astfel pentru fiecare poz care exista n folderul pictures dar nu
se afl i n folderul thumbnails i vom crea o poz n miniatur cu dimensiunile stabilite prin
variabila 'ma.*idth i 'ma.*idth bineneles pstrnd proporiile pozei originale
calculate cu ajutorul variabilei 'ratio, astfel nct dac lungimea pozei originale este mai mare
dect nlimea, atunci 'ratio va lua valoarea lungimei maxime setate n variabila
'ma.*idth mprit la lungimea pozei originale, iar n caz contrar 'ratio va lua valoarea
nlimii maxime setate pentru thumbnail mprite la nlimea pozei originale.
Rezoluia pozei originale o aflm cu ajutorul funciei getimagesi4e/0 care returneaz un
vector cu atributele pozei.
Vom afla n continuare noile dimensiuni ale pozei n miniatur calculate n variabilele
'thumbnail.*idth i 'thumbnail.height prin mulirea dimensiunilor pozei originale cu
'ratio.
Cod:
<?php
$diff_pic = array_diff($pictures, $thumbnails);
$diff_tumb = array_diff($thumbnails, $pictures);
foreach($diff_pic as $key => $value)
{
$image_name = 'pictures/'.$value;
$image_attribs = getimagesize($image_name);
$max_width = 100;
$max_height = 100;
$ratio = ($image_attribs[0] > $image_attribs[1]) ? $max_width / $im
age_attribs[0] : $max_height / $image_attribs[1];
$thumbnail_width = $image_attribs[0] * $ratio;
$thumbnail_height = $image_attribs[1] * $ratio;
n continuare vom crea acele thumbnail-uri ale pozelor prin aplicarea funciilor PHP pentru
imagini. Pentru nceput vom returna o imagine din poza original cu ajutorul funciei
imagecreatefromjpeg/0 dup care vom crea o imagine neagr cu dimensiunile calculate mai
sus pentru thumbnail.
Numele pozei n miniatur va fi acelai cu numele pozei originale numai c o vom salva n alt
director. Calea ctre thumbnail o vom ine ntr-o variabil 'thumbnail.name, apoi vom
copia imaginea original peste imaginea thumbnail pstrnd proporiile. Vom crea imaginea
jpg n calea specificat n variabila 'thumbnail.name cu ajutorul funciei imagejpeg/0.
Cod:
$image = imagecreatefromjpeg($image_name);
$image_new = imagecreatetruecolor($thumbnail_width, $thumbnail_heig
ht);
imageantialias($image_new, true);
$thumbnail_name = 'thumbnails/'.$value;
imagecopyresampled($image_new, $image, 0, 0, 0, 0, $thumbnail_width,
$thumbnail_height, $image_attribs[0], $image_attribs[1]);
imagejpeg($image_new, $thumbnail_name);
imagedestroy($image);
}
?>
Este posibil ca n directorul thumbnails s se afle imagini ale pozelor care nu se mai afl n
directorul pictures, acestea nu sunt necesare i le vom terge cu ajutorul funciei unlin,/0.
V amintii c mai sus am aflat care sunt pozele care se afla n directorul thumbnails dar nu
se afla n directorul pictures cu ajutorul funciei array.diff/0 care face diferena dintre
valorile primului vector analizat i cel de-al doilea vector.
Cod:
<?php
foreach($diff_tumb as $key => $value)
{
unlink("thumbnails/".$value);
}
?>
n acest moment avem create thumbnail-urile imaginilor originale i le vom afia n pagin
ncadrate ntr-un tabel cu 'modulo celule, cu link ctre pozele originale. Mai jos avei ntreg
codul surs pentru crearea imaginilor thumbnail i afiarea acestora n pagin.
Cod:
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"
/>
<title>Thumbnails</title>
</head>
<body>
<?php
$open_pictures = opendir("pictures");
while($file = readdir($open_pictures))
{
if(substr($file, 0, 1) != '.')
{
$pictures[] = $file;
}
}
closedir($open_pictures);
$open_thumbnails = opendir("thumbnails");
while($file = readdir($open_thumbnails))
{
if(substr($file, 0, 1) != '.')
{
$thumbnails[] = $file;
}
else
{
$thumbnails = array();
}
}
closedir($open_thumbnails);
$diff_pic = array_diff($pictures, $thumbnails);
$diff_tumb = array_diff($thumbnails, $pictures);
foreach($diff_pic as $key => $value)
{
$image_name = 'pictures/'.$value;
$image_attribs = getimagesize($image_name);
$max_width = 100;
$max_height = 100;
$ratio = ($image_attribs[0] > $image_attribs[1]) ? $max_width / $im
age_attribs[0] : $max_height / $image_attribs[1];
$thumbnail_width = $image_attribs[0] * $ratio;
$thumbnail_height = $image_attribs[1] * $ratio;
$image = imagecreatefromjpeg($image_name);
$image_new = imagecreatetruecolor($thumbnail_width, $thumbnail_heig
ht);
imageantialias($image_new, true);
$thumbnail_name = 'thumbnails/'.$value;
imagecopyresampled($image_new, $image, 0, 0, 0, 0, $thumbnail_width,
$thumbnail_height, $image_attribs[0], $image_attribs[1]);
imagejpeg($image_new, $thumbnail_name);
imagedestroy($image);
}
foreach($diff_tumb as $key => $value)
{
unlink("thumbnails/".$value);
}
$open_thumbnails = opendir("thumbnails");
$l = 0;
$modulo = 4;
echo '<table border="0" align="center">';
while($file = readdir($open_thumbnails))
{
if(substr($file, 0, 1) != '.')
{
if($l % $modulo == 0)
{
echo '<tr>';
echo '<td align="center" valign="middle"><a href="pictures/'
.$file.'" target="_blank" title="Click to enlarge!" >';
echo '<img src="thumbnails/'.$file.'" alt="thumbnail" borde
r="0" />';
echo '</a></td>';
}
if($l % $modulo == $modulo - 1)
{
echo '</tr>';
}
$l++;
$unfinished = $l % $modulo;
}
}
closedir($open_thumbnails);
if($unfinished != 0)
{
for($k = $unfinished; $k < $modulo; $k++)
{
echo '<td>&nbsp;</td>';
}
echo '</tr>';
}
echo '</table>';
?>
</body>
</html>
Articol preluat de la http://boo.opaq.org
Autentificarea n paginile restricionate i cteva informaii despre cookie, uploadul
fiierelor i includerea lor n pagini, precum i informaii despre starea conexiunii.
Dup cum probabil tii, anumite site-uri au accesul restricionat i coninutul lor poate fi
accesat numai de ctre anumite persoane autorizate. Una dintre variantele prin care poate fi
verificat faptul dac un anumit utilizator are dreptul de a accesa un anumit site este cererea
introducerii unui nume de utilizator i a unei parole n momentul n care persoana respectiv
ncearc s acceseze aceste informaii. n momentul acceasrii paginii web este trimis un
mesaj care indic faptul c autentificarea este necesar. Programul de navigare va afia o
caset de dialog care permite introducerea unui nume de utilizator i a unei parole. Dup
introducerea informatiilor necesare va fi accesat din nou pagina web dar, de aceast data,
variabilele predefinite PHP_A5TH_5SER, PHP_A5TH_PF i PHP_A5TH_TXPE vor conine
numele de utilizator, parola, respectiv tipul autentificrii. Pentru a trimite mesajul care cere
autentificarea este utilizat funcia hea,er/0 . Nu este posibil dect autentificarea de tip
"Basic". Un exemplu n care este prezentat o autentificare naintea accesrii informaiilor este
prezentat n continuare:
Cod:
<?php
if (!isset($_SERVER['PHP_AUTH_USER']))
{
header ('WWW-Authenticate: Basic realm="php4"');
header ('HTTP/1.0 401 Unauthorized');
echo 'Pentru accesarea continutului este necesara o autentificare!'
;
exit;
}
else
{
echo "<html><head>";
echo "<title>Autentificare</title>";
echo "</head><body>";
echo "<p>Salut <b><i>{$_SERVER['PHP_AUTH_USER']}</i></b>!</p>";
echo "<p>Parola introdusa este <b><i>{$_SERVER['PHP_AUTH_PW']}</i><
/b>.</p>";
echo "</body></html>";
}
?>
Rezultatul codului de mai sus l putei vedea dnd clik aici.
Pentru o compatibilitate ct mai mare, cuvntul 3asic trebuie scris cu majuscul, valoarea
pentru realm trebuie s fie cuprins ntre ghilimele (nu ntre apostrofuri), iar ntre HTTP"<.Q i
OQ< trebuie s existe exact un spaiu. n acest exemplu, numele de utilizator i parola sunt
afiate. n practic, se va verifica validitatea lor, de obicei printr-o interogare a unei baze de
date. n situaia n care este apsat butonul Cancel, pagina web generat va conine un mesaj
de avertizare.
Funcia setcookie.
n PHP exist o funcie special care poate fi folosit pentru crearea %oo)ie-urilor i anume
setcoo,ie/0. Funcia definete un cookie care va fi trimis mpreun cu celelalte headere HTTP.
Ca i alte headere, cookies trebuie trimis naintea oricrui caracter din script (aceasta
deoarece exist o restricie de protocol, nu se poate trimite coninutul paginii i apoi headerul,
headerele trebuiesc trimise primele, naintea oricrui mesaj). Dac a fost trimis ceva la
browser (chiar i un simplu spaiu blank) nainte de apelarea acestei funcii, setcoo,ie/0 va
genera un mesaj de eroare de tipul FALSE. Dac setcoo,ie/0 a putut genera cu succes
cookie-ul, va returna TRUE. Aceasta nu indic dac userul a acceptat sau nu cookie, ci doar c
a fost generat i trimis cu succes.
ncepnd de la php4, putei folosi funciile ob.start/0 la nceputul scriptului i
ob.end.flush/0 la sfritul scriptului pentru a se genera un buffer cu tot ce trebuie trimis la
browser, i astfel la sfrit se vor trimite toate odat, ncepnd cu headerele i continund cu
restul paginii, indiferent dac n script ai trimis nti text i apoi headere (folosind prima
funcie, buffer-ul se va genera pe msur ce primete date, iar la sfrit, cnd se cere
nchiderea buffer-ului prin apelarea celei de-a doua funcii - ob.end.flush/0 - , headerele se
vor trimite primele apoi restul buffer-ului).
O alt variant este de a seta directiva output.buffering din php.ini (n fiierul de
configurare al serverului).
Funcia setcoo,ie/0 are ase parametri, doar prezena primului parametru fiind obligatorie.
Sintaxa este:
setcoo,ie/nume6 !aloare6 epirare6 cale6 domeniu6 securitate07
Parametru Descriere Exemplu
n*$e ir de caractere care reprezint
numele cookie-ului
'nume_cookie' va fi apelat ca
'.8OO9:;<=nume.coo,ie=>
Caloare ir de caractere care reprezint
valoarea cookie-ului (informaia
corespunztoare), care va fi
salvat pe calculatorul clientului
(nu trimitei date sensibile, gen
parola)
Presupunnd c numele este 'cookiename',
valoarea va fi preluat prin
'.8OO9:;<=coo,iename=>
e#pirare un numr ntreg care indic
momentul de timp n care
cookie-ul nu va mai putea fi
utilizat. Valoarea este n format
"Unix timestamp", adic se poate
seta folosind funcia time/0 plus
numrul de secunde pn cnd
dorii s expire, sau putei folosi
m,time/0.
time/0#?@%?@%$A%&@ va seta cookie s expire
n 30 de zile. Dac nu e setat, cookie va expira la
terminarea sesiunii curente (cnd se nchide
browserul)
%ale ir de caractere care reprezint o
cale generic a fiierelor care pot
accesa cooke-ul
Dac este setat ca '/', cookie va fi accesibil
pentru ntreg domeniu. Dac este setat ca '/foo/',
atunci cookie va fi accesibil doar pentru fiierele
i scripturile din directorul /foo/ (de pe server)
nclusiv toate sub-directoarele acelui director,
cum ar fi /foo/bar/. Valoarea standard este setat
ca directorul curent (directorul curent adic
directorul n care exist scriptul care a setat acel
cookie).
,o$eni* ir de caractere care reprezint
domeniul pe care trebuie stocate
fiierele care pot accesa cookie-
ul
Pentru a face cookie disponibil pentru toate
subdomeniile, de exemplu domeniu.com putei
seta astfel '.domeniu.com'. Punctul dinainte nu
este neaparat necesar, dar l face compatibil cu
mai multe browsere. Setnd ca
www.example.com vei face cookie-ul disponibil
doar pentru sub-domeniul www. Pentru alte
detalii vedei specificaiile de aici.
se%*ritate numr ntreg care, dac are
valoarea 1 (TRUE), arat c
informaia poate fi transmis
doar folosindu-se o conexiune
HTTPS securizat. Setarea de
baz este 0 (FALSE)
0 sau 1
Dac unul dintre parametri este prezent, atunci toi parametrii anteriori trebuie s fie prezeni.
Dac unul dintre acetia nu este utilizat, se va folosi n poziia respectiv fie irul vid, fie
valoarea 0. n continuare sunt prezentate cteva exemple de apeluri prin care sunt create
%oo)e-uri:
- set%oo)ie />Test:oo)ie>. >PHPO>0E
- set%oo)ie />Test:oo)ie>. >Site>. ti$e/0@BLQQ0E
"" e#pirU ,*pa o orU ,e la %reare
- set%oo)ie />Test:oo)ie>. >Test>. ti$e/0@BLQQ. >"arti%ole">. >.phpO.as.ro>.<0;
Cu ajutorul funciei setcoo,ie/0 este posibil i tergerea cookie-urilor. Urmtoarele exemple
ilustreaz modul n care poate fi realizat aceast operaie:
set%oo)ie />Test:oo)ie>. >>. ti$e/0RBLQQ0E
sau
set%oo)ie />Test:oo)ie>. >>. ti$e/0RBLQQ. >"%o$en;i">. >.phpO.as.ro>. <0E
Se observ c momentul expirrii este setat ca fiind anterior momentului executrii operaiei
de stergere. Exist posibilitatea de a crea iruri de cookie-uri prin simpla introducere a
parantezelor drepte n denumiri. Un exemplu de creare i utilizare a unor astfel de iruri este
prezentat n continuare:
Cod:
<?php
setcookie ("cookie[three]", "cookiethree");
setcookie ("cookie[two]", "cookietwo");
setcookie ("cookie[one]", "cookieone");
if (isset ($cookie))
{
while (list($name,$value)=each($cookie))
{
echo "$name == $value<br>";
}
}
?>
Pentru a accesa cookie-urile stocate pe calculatorul unui vizitator al paginii Web, este
disponibil vectorul '.8OO9:;. Voi prezenta n continuare un exemplu cu ajutorul cruia se
genereaz o pagin care conine denumirile i valorile tuturor %oo)ie-urilor.
Cod:
<?php
foreach ($_COOKIE as $cheie=>$valoare)
{
echo "$cheie = $valoare<br>";
}
?>
Fiierele pot fi ncrcate pe un server dac utilizatorul folosete un program de navigare
compatibil RFC-1867; pot fi utilizate ultimile versiuni ale celor mai cunoscute bro9sere. Este
posibil ncrcarea att a fiierelor text, ct i a celor binare. Folosind autentificarea PHP i
funciile de manipulare a fiierelor, avem controlul total asupra utilizatorilor care pot ncrca
fiiere i asupra operaiilor efectuate cu fiierul ncrcat.
Formularul de ncarcare (upload)
Pentru ca utilizatorul s poat ncrca un fiier, el trebuie s aib la dispoziie un formular care
s permit alegerea fiierului. Un astfel de formular poate fi creat, de exemplu, folosind
limbajul HTML standard. n continuare este prezentat un document HTML care genereaz o
pagina web care permite alegerea unui fiier i ncrcarea sa pe un server.
Cod:
<html>
<head>
<title>Incarcarea unui fisier pe server</title>
</head>
<body>
<form enctype="multipart/form-data" action="upload.php" method="post">
Alegeti fisierul: <br>
<input name="fisier" type="file">
<input type="hidden" name="MAX_FILE_SIZE" value="1024"><br>
<input type="submit" value="Trimite fisierul!">
</form>
</body>
</html>
Butonul 2ro9se... poate fi utilizat pentru alegerea unui fiier care urmeaz a fi ncrcat. Este
posibil specificarea fiierului preciznd exact calea n caseta de text afiat. URL-ul care este
folosit ca valoare pentru atributul action al marcajului S&ro$N trebuie s reprezinte
documentul php care va realiza ncrcarea.
Operatia de ncarcare (upload)
Aadar, formularul prin intermediul cruia este ales fiierul va fi prelucrat de ctre un script
PHP. Pentru a manipula fiierele poate fi utilizat tabloul '.B:L;+. Pentru script-ul care
prelucreaz formularul prezentat anterior, informaiile referitoare la fiierul ncrcat vor fi
acceasate folosind variabila '.B:L;+<=fisier=> care este tot un vector. Elementele acestui
vector sunt prezentate n cele ce urmeaz:
- '.B:L;+<=fisier=> <=name=>
numele pe care l are fiierul pe calculatorul utilizatorului;
- '.B:L;+<=fisier=> <=tmp.name=>
numele temporar pe care l are fiierul pe server dup ncheierea procesului de ncrcare;
- '.B:L;+<=fisier=> <=type=>
tipul fiierului n cazul n care programul de navigare furnizeaz aceast informaie; un
exemplu ar putea fi image/gif;
- '.B:L;+<=fisier=> <=si4e=>
dimensiunea fiierului, exprimat n bytes;
- '.B:L;+<=fisier=> <=fisier=> <=error=>
un cod de eroare generat n urma efecturii ncrcrii.
Fiierul va fi stocat pe server n directorul care conine fiierele temporare. O secven de
instruciuni PHP care poate fi folosit pentru a prelucra fiierul ncrcat i a-l muta n directorul
dorit este urmtoarea:
Cod:
<?php
if (is_uploaded_file($_FILES['fisier']['tmp_name'))
{
copy($_FILES['fisier']['tmp_name'],"/directorul/dorit");
}
else
{
echo "Eroare de transfer ".$_FILES['fisier']['name'];
}
?>
O variant alternativ ar fi:
Cod:
<?php
move_uploaded_file($_FILES['fisier']['tmp_name'],"/directorul/dorit");
?>
Coduri de eroare
ncepnd cu versiunea PHP 4.2.0, n urma efecturii unui transfer, sunt generate anumite
coduri de eroare. Versiunea 4.3.0 introduce constante predefinite pentru fiecare dintre aceste
coduri. n funcie de codul de eroare generat n urma operaiei, trebuie realizate diferite
aciuni. Codul de eroare poate fi accesat prin intermediul elementului <=error=> al vectorului
care pstreaz informaiile despre fiier. Codurile de eroare care pot fi generate sunt
urmtoarele:
- UPLOAD_ERR_OK (0)
nu a fost semnalat nici o eroare n timpul transferului; operaia de ncrcare s-a ncheiat
cu succes;
- UPLOAD_ERR_INI (1)
dimensiunea fiierului este mai mare dect valoarea maxim permis (aceast valoare
este specificat n momentul configurrii server-ului i poate fi schimbat modificnd fiierul
PHP.INI);
- UPLOAD_ERR_FORM_SIZE (2)
dimensiunea fiierului este mai mare dect valoarea maxim indicat de directiva
C1D.B:L;.+:E; care este specificat n formular; aceast valoare este specificat prin
intermediul unui cmp ascuns al crui text este C1D.B:L;.+:E;;
- UPLOAD_ERR_PARTIAL (3)
fiierul a fost ncrcat doar parial;
- UPLOAD_ERR_NO_FILE (4)
nu a fost ncrcat nici un fiier.
ncrcarea mai multor fiiere
Exist posibilitatea de a ncrca mai multe fiiere dac sunt folosite nume diferite pentru
marcajul <input> utilizat pentru afiarea casetei de text i a butonului folosite pentru alegerea
fiierului. De asemenea, este posibil ca fiierele ncrcate s fie organizate automat ntr-un
vector. Pentru aceasta, la numele folosite trebuie adaugate caracterele ' [ ] '. Un exemplu este
prezentat n continuare:
Cod:
<?php
<form action="upload.php" method="post" enctype="multipart/form-data">
Alegeti fisierele:<br>
<input name="fisiere[]" type="file">
<br>
<input name="fisiere[]" type="file">
<br>
<input type="submit" value="Trimite fisierele">
</form>
?>
S presupunem c am ales s ncrcm fiierele POZA1.GIF i DOC1.PDF. n acest caz,
'.B:L;+<=fisiere=><=name=><@> va avea valoarea POZA1.GIF, n timp ce '.B:L;+<=fisiere=>
<=name=><"> va avea valoarea DOC1.PDF. Dimensiunile celor dou fiiere pot fi determinate
folosind valorile '.B:L;+<=fisiere=><=si4e=><@>, respectiv '.B:L;+<=fisiere=><=si4e=><">.
Includerea fiierelor
Deseori, mai multe pagini web pe care le crem trebuie s conin secvene identice. Evident,
putem copia secvenele dintr-un fiier n altul, dar aceast varianta, pe lng faptul c este
incomod, duce la un consum mrit de spaiu pe server i, n cazul n care secvenele sunt
lungi sau sunt folosite n foarte multe pagini, problema este destul de important.
Interpretorul PHP permite pstrarea secvenelor comune n fiiere separate i accesarea
acestora din cadrul altor documente PHP. Pentru a accesa un astfel de fiier, poate fi utilizat
directiva include/0. Practic, din punct de vedere logic, tot coninutul fiierului inclus este
inserat n poziia n care apare directiva. Sintaxa acestei directive este include/fisier07. S
presupunem c avem un fiier numit HELLO.TGT cu urmtorul coninut:
Cod:
<?php
echo "Pagina de test";
?>
n continuare avei un model n care putei vedea cum poate fi inclus acest fiier ntr-un
document php.
Cod:
<head>
<title>Pagina cu fisier inclus</title>
</head>
<body>
<?php
include("HELLO.TXT");
?>
</body>
</html>
Pentru ca fisierul inclus sa fie interpretat, acesta trebuie
obligatoriu sa indice faptul ca secventele de text din cadrul sau
reprezinta instructiuni php. Asadar, prezenta constructiei <?php... ?>
este necesara pentru ca textul sa fie interpretat corect. Daca fisierul
HELLO.! ar contine doar secventa echo "Pagina de test";, atunci
acesta nu ar fi interpretat ca fiind cod php, ci ca fisier html.
Aceasta se datoreaza faptului ca n momentul includerii unui fisier se
iese din modul PHP si tot textul este interpretat ca fiind cod HTML.
Dupa interpretarea textului din fisierul inclus se intra din nou n
modul PHP. n concluzie, folosirea celor doua fisiere este echivalenta
cu utilizarea urmatorului fisier:
Cod:
<head>
<title>Pagina cu fisier inclus</title>
</head>
<body>
<?php
echo "Pagina de test";
?>
</body>
</html>
Includerea n cadrul funciilor
Daca directiva de includere apare n cadrul unei functii, atunci se
considera ca toate instructiunile din cadrul fisierului inclus fac
parte din corpul functiei. Asadar, domeniul de vizibilitate al
variabilelor folosite n fisierul inclus este acelasi cu domeniul pe
care l-ar fi avut daca ar fi aparut n cadrul functiei. Pentru a
ilustra acest aspect vom considera un fisier var.txt care contine
secventa:
Cod:
<?php
$culoare = "verde";
$fruct = 'mar';
?>
si urmatorul document PHP:
Cod:
<?php
function fructe()
{
global $culoare;
include('var.txt');
echo "un $fruct $culoare<br>";
}
fructe();
echo "un $fruct $culoare<br>;
?>
Rezultatul va fi:
un mar verde
un verde
Dupa cum se poate vedea, variabilele definite n cadrul fisierului
inclus au domeniul de vizibilitate corespunzator functiei fruct"(). Din
aceste motive valoarea variabilei $fruct nu este disponibila n afara
functiei. Valoarea variabilei $cu#oar" este disponibila si n afara
functiei, deoarece a fost declarata ca fiind o variabila globala.
Asadar, instructiunea "cho din cadrul functiei duce la afisarea
mesajului
un $ar v"r%",
deoarece ambele valori ale variabilelor sunt disponibile, iar
instructiunea din afara functiei duce la afisarea mesajului
un v"r%",
deoarece, n afara functiei, variabila $fruct nu a fost definita
anterior si este automat initializata cu sirul vid.
Includeri prin HTTP
Dupa cum ati observat, directiva include are ca parametru un sir de
caractere care contine numele fisierului care va fi inclus. Acesta
poate fi orice URL valid, asadar este posibila includerea unui fisier
aflat pe un alt server. Un exemplu ar putea fi
include(&http'(())).*it"+u#.$"u(pa,ina.$"a&);. O astfel de directiva
functioneaza doar daca se foloseste PHP 4.3.0 sau o versiune ulterioara.
Includerea unui fiier o singur dat
Uneori, mai ales n situatiile n care se folosesc variabile pentru
numele fisierelor incluse, este posibil ca anumite fisiere sa fie
incluse de mai multe ori. De obicei, fisierele incluse contin definitii
ale unor functii sau clase, motiv pentru care este de dorit ca un
astfel de fisier sa nu fie inclus de mai multe ori. Pentru ca un fisier
sa fie inclus o singura data, se utilizeaza o directiva alternativa
numita include_once. Dupa cum rezulta din denumire, un fisier va fi
inclus o singura data. Cu alte cuvinte, n momentul n care se cere
includerea unui fisier, se verifica daca acesta a fost deja inclus si
n aceasta situatie directiva nu are nici un efect (fisierul nu este
inclus nca o data).
Alternative:
Pe lnga directivele includesi include_once exista doua alte directive
a caror utilizare are un efect aproape echivalent. Acestea sunt require
(echivalenta cu include) si require_once (echivalenta cu include_once).
Singura diferenta dintre include si require (respectiv dintre
include_oncesi require_once) este data de modul n care este tratata
situatia n care fisierul care se doreste a fi inclus nu exista sau nu
este disponibil. n cazul directivelor include si include_once este
generat un avertisment si executia script-ului continua fara ca
fisierul sa fie inclus. Practic, din punct de vedere logic, este
ignorata directiva. n cazul directivelor require si require_once este
generata o eroare fatala si executia script-ului este ntrerupta.
Asadar, n situatiile n care este absolut necesara existenta
fisierului, pentru a nu aparea efecte bizare, trebuie utilizata
directiva require, respectiv require_once.
Starea conexiunii
n PHP, conexiunea poate avea una dintre cele trei stari posibile:
- !"#$% (&'
starea normala de functionare;
- $(!"T)* (+'
utilizatorul care acceseaza pagina generata de script-ul aflat
n executie s-a deconectat (de obicei prin apasarea butonului Stop al
programului de navigare);
- TI#)!,T (-'
a fost atinsa limita de timp impusa de PHP.
Pentru fiecare dintre cele trei stari exista un indicator (f#a,) care
este setat sau nu n functie de starea conexiunii. n functie de
script, este necesar sau nu ca executia acestuia sa se incheie n
momentul n care este ntrerupta conexiunea. De exemplu, n cazul n
care script-ul actualizeaza o baza de date ar fi de dorit ca executia
sa continue. n principiu, este indicat ca script-urile sa si ncheie
executia chiar daca datele de iesire nu vor mai fi trimise
utilizatorului. Pentru a decide daca executia script-ului se va ncheia
n momentul ntreruperii conexiunii puteti (sau nu!) sa apelati functia
ignore_user_abort(). Implicit, n momentul n care conexiunea este
ntrerupta, se ntrerupe si executia script-ului. Este posibil (chiar
recomandabil!) sa fie definita o functie care va fi executata naintea
ntreruperii executiei script-ului. Aceasta poarta denumirea de funcie
de de.activare (*hut%o)n function) si este definita la fel ca orice
alta functie. Pentru a specifica faptul ca o anumita functie trebuie
apelata naintea intreruperii executiei, aceasta trebuie nregistrata
ca fiind functie de dezactivare. Aceasta se realizeaza printr-un apel
al functiei registrer_shutdown_function(). n cadrul functiei se poate
testa daca executia a fost determinata de ntreruperea conexiunii prin
apelarea functiei connexion_aborted(). Aceasta va returna valoarea T",)
daca a fost ntrerupta conexiunea. Functia de dezactivare va fi apelata
automat si n cazul n care este depasita limita de timp. n cadrul
functiei se poate testa daca un astfel de eveniment a avut loc prin
apelarea functiei connection_aborted() care returneaza valoarea T",) n
cazul depasirii acestei limite. Exista posibilitatea de a testa ambele
indicatoare printr-un singur apel al functiei connection_status().
Functia va returna un numar ntreg ai carui biti reprezinta
indicatoarele. De exemplu, daca sunt setate indicatoarele ABORTED si
TIEO!T, valoarea returnata va fi 3. Trebuie remarcat faptul ca este
posibil ca indicatorii ABORTED si TIEO!T sa fie ambii setati la un
moment dat. Aceasta situatie poate aparea n cazul n care ntreruperea
conexiunii este ignorata. PHP va detecta faptul ca a fost ntrerupta
conexiunea si va seta indicatorul corespunzator. Totusi, executia
script-ului va continua si este posibil sa expire si limita de timp,
moment n care este setat si indicatorul TIEO!T. Implicit, limita de
timp este de 30 de secunde, dar ea poate fi modificata folosind functia
set_ti"e_li"it().
/iiere aflate la distan
Asa cum am spus n sectiunea dedicata includerii fisierelor, ncepnd
cu versiunea PHP 4.3.0 este posibila includerea de fisiere aflate pe
alte servere. Evident, este posibila utilizarea de fisiere aflate pe
alte servere si n alte scopuri. Practic, n aproape toate functiile
care manipuleaza fisiere, pot fi folosite att fisiere locale, ct si
fisiere aflate la distanta. n continuare este prezentat modul n care
pot fi citite date dintr-un fisier aflat pe server:
Cod:
<?php
// accesam fisierul si setam atributul r de la citire (read)
$file = fopen("locatia/fisierului/nume_fisier.extensia", "r");
if(!$file)
{
echo "Fisierul nu poate fi accesat!\n";
exit;
}
// citirea datelor din fisier
// inchiderea fisierului
fclose ($file);
?>
Pentru a scrie n fisier se poate folosi o secventa de tipul:
Cod:
<?php
// accesam fisierul si setam atributul w de la scriere (write)
$file=fopen("locatia/fisierului/nume_fisier.extensia", "w");
if(!$file)
{
echo "Fisierul nu poate fi accesat!\n";
exit;
}
// scrierea datelor in fisier
// inchiderea fisierului
fclose ($file);
?>
Puteti folosii aceste idei pentru a creea o pagina cu acces
restrictionat, si unde sa scrieti ntr-un fisier pe server datele
vizitatorului (cum ar fi adresa lui de ip, host, timpul ct a stat pe
pagina respectiva, ce pagini a vizitat etc...).
Descrierea funciilor care pot fi utilizate la manipularea tablourilor
Funcia array_change_key_case
Aceast funcie realizeaz conversia tuturor literelor care apar n cadrul denumirilor cheilor
elementelor unui tablou. Funcia are doi parametri: un tablou asupra cruia se vor efectua
modificrile i un ntreg care arat dac se vor converti toate literele mari n litere mici sau
invers. Pentru acest parametru pot fi utilizate constantele predefinite CASE_UPPER (conversie
la litere mari) i CASE_LOWER (conversie la litere mici). Acest parametru poate lipsi, caz n
care va avea valoarea implicit CASE_LOWER , deci va realiza conversia tuturor literelor mari
n litere mici. Urmtorul script PHP ilustreaz modul n care poate fi utilizat aceast funcie.
Cod:
<?php
$a = array("Pagina" => "Pagina", "de" => "de", "Php" => "Php");
echo "<TABLE cellpadding= 5>
<TR><TD><B>Tabloul initial:</B><TD>
<TT>";
print_r($a);
echo "</TT>
<TR><TD><B>Tabloul dupa conversia implicita:</B><TD><TT>";
$b = array_change_key_case($a);
print_r($b);
echo "</TT><TR><TD><B>Tabloul dupa conversia la litere mari:
</B><TD><TT>";
$b = array_change_key_case($a,CASE_UPPER);
print_r($b);
echo "</TT><TR><TD><B>Tabloul dupa conversia la litere mici:
</B><TD><TT>";
$b = array_change_key_case($a,CASE_LOWER);
print_r($b);
echo "</TT></TABLE>";
?>
Dup cum se poate vedea, funcia are efect doar asupra cheilor elementelor, valorile acestora
rmnnd nemodificate.
Funcia array_chunks
Aceast funcie poate fi utilizat pentru a mpri un tablou n mai multe bucti (chunks). Ea
are trei parametri, i anume: vectorul care urmeaz a fi mprit, dimensiunea unei buci
(numrul de elemente) i un indicator care arat dac se pstreaz sau nu cheile elementelor
(acesta poate lipsi; n acest caz are valoarea implicit &alse, deci nu se vor pstra cheile
elementelor). n cazul n care numrul elementelor tabloului iniial nu este multiplu al
dimensiunii unei buci, atunci ultima bucat va fi mai "scurt" . Funcia va returna un tablou
al bucilor (un tablou de tablouri).
n continuare este prezentat un exemplu care arat utilizarea acestei funcii:
Cod:
<?php
$vector = array("a", "b", "c", "d", "e");
echo "<pre>";
print_r(array_chunk($vector, 2));
echo "<p>";
print_r(array_chunk($vector, 2, TRUE));
echo "</pre>";
?>
Funcia array_count_values
Aceast funcie are ca parametru un tablou i returneaz un alt tablou ale crui elemente au
chei date de valorile elementelor tabloului transmis ca parametru. Pentru fiecare valoare se va
genera un singur element (chiar dac valoarea apare de mai multe ori), iar valoarea
elementului respectiv este dat de numrul apariiilor. De exemplu, n urma execuiei unei
secvene de forma:
$tablo* = arra3 /<. >Pagina> . <. >$ea> . >Pagina> 0E
$re; = arra3_%o*nt_Cal*es /$tablo*0E
vectorul $rez va conine trei elemente, acestea vor avea cheile <, Paginai $ea, iar valorile
vor fi =, =, respectiv <.
Funciile array_diff i array_diff_assoc
Uneori dorim s eliminm dintr-un tablou anumite elemente; n acest scop pot fi utilizate
funciile arra3_,i&&/ 0 i arra3_,i&&_asso%/ 0 .
Acestea au ca parametri mai multe tablouri i returneaz un tablou care conine toate
elementele din tabloul reprezentat de primul parametru care nu apar n nici unul dintre
tablourile corespunzatoare celui de-al doilea parametru. n cazul funciei arra3_,i&&/ 0 sunt
eliminate elemente din primul tablou dac n celelalte exist elemente cu aceeai valoare. n
cazul functiei arra3_,i&&_asso%/ 0 sunt eliminate elemente din primul tablou dac n celelalte
exist elemente cu aceeai valoare i aceeai cheie.
Funcia array_fill
Aceast funcie poate fi utilizat pentru a completa cu o anumit valoare elementele unui
tablou. Funcia are trei parametri: primul reprezint indicele la care ncepe completarea, al
doilea reprezint numrul elementelor completate, iar cel de-al treilea indic valoarea cu care
se completeaz elementele. De exemplu, n urma executrii instruciunii
$a = arra3_&ill/J. L. 'Pagina $ea7 ' 0E
vom avea un tablou cu sase elemente (cheile acestora sunt 5, 6, 7, 8, 9 si 10), valorile tuturor
acestora fiind Pagina $ea7 .
Funcia array_filter
Aceast funcie realizeaz o filtrare a elementelor unui vector pe baza unei funcii. Funcia
arra3_&ilter/ 0 are ca parametri un tablou i identificatorul funciei care este utilizat pentru
filtrare. Aceast funcie trebuie s fie definit i va fi apelat pentru fiecare element al
vectorului. n cazul n care funcia returneaz valoarea true (eventual, n urma conversiei la
tipul boolean), elementul este pstrat; n caz contrar, acesta este eliminat. Funcia
arra3_&ilter/ 0 returneaz vectorul obinut dup eliminarea elementelor. n continuare este
prezentat un exemplu n care se utilizeaz aceast funcie pentru a filtra elementele unui
vector n funcie de paritatea acestora.
Cod:
<?php
function impar($var)
{
return $var % 2;
}
function par($var)
{
return 1 - $var % 2;
}
$vector = array("2", "4", "5", "7");
echo "<pre>";
print_r(array_filter($vector, par));
echo "<p>";
print_r(array_filter($vector, impar));
echo "</pre>";
?>
Funcia array_flip
Aceast funcie are ca parametru un tablou i returneaz un alt tablou n care a fost realizat
o interschimbare a cheilor elementelor cu valorile. Cu alte cuvinte, pentru fiecare element va fi
creat un element a crui cheie va fi vaIoarea elementului n tabloul iniial i a crui valoare va
fi cheia elementului din tabloul iniial. De exemplu, pentru tabloul definit prin
$tablo* = arra3/>A> =N >Pagina> . >2> =N >,e> . >:> =N >php>0E
n urma executrii apelului
$b = arra3_&lip/$tablo*0
tabloul $b va avea forma
arra3/>Pagina> =N >A> . >,e> =N >2> . >php> =N >:>0
n cazul n care n vectorul transmis ca parametru exist mai multe elemente care au aceeai
valoare, datorit faptului c elementele unui vector trebuie s aib chei distincte, vor fi
eliminate toate aceste elemente, cu excepia ultimului.
Funciile array_intersect i array_intersect_assoc
Aceste funcii au un comportament similar funciilor arra3_,i&&/ 0, respectiv
arra3_,i&&_asso%/ 0. Singura diferen este dat de faptul c tabloul rezultat va conine toate
elementele care se afl n fiecare dintre tablourile transmise ca parametri (pentru funcia
arra3_,i&&/ 0 elementele trebuie s aib aceeai valoare, n timp ce pentru funcia
arra3_,i&&_asso%/ 0 ele trebuie s aib aceeai cheie i aceeai valoare).
Funcia array_key_exists
Aceast funcie are doi parametri (o cheie i un vector) i verific, aa cum sugereaz i
numele, dac vectorul conine un element cu cheia respectiv. Funcia returneaz o valoare
logic, iar pentru parametrul care reprezint cheia poate fi folosit orice valoare care poate fi
cheie ntr-un vector.
Funcia array_keys i array_values
Aceste funcii returneaz un vector care conine ca valori toate cheile (respectiv toate valorile)
elementelor unui tablou transmis ca parametru. Pentru funcia arra3_)e3s/ 0, n cazul n care
se foloseste un parametru suplimentar, vectorul rezultat va conine doar cheile elementelor
care au valoarea egal cu cea indicat de acest parametru.
Funcia array_map
Aceast funcie realizeaz o transformare a elementelor unui vector pe baza unei funcii.
Funcia este transmis ca parametru i este aplicat tuturor elementelor unui vector care este,
i el, transmis ca parametru. Iat un exemplu:
Cod:
<?php
function cub($n)
{
return $n * $n * $n;
}
$a = array(l, 2, 3, 4, 5);
$b = array_map("cub", $a);
?>
n urma executrii secvenei, vectorul $b va avea cinci elemente ale cror valori vor fi 1, 8,
27, 64 i 125.
Exist posibilitatea de a transmite mai multe tablouri ca parametri. n acest caz, numrul
argumentelor funciei utilizate trebuie s fie egal cu numrul tablourilor transmise i se
recomand ca tablourile s aib acelai numr de elemente. n caz contrar, tablourile mai
"scurte" vor fi completate cu elemente nule. Un artificiu interesant permite crearea unor
vectori de vectori folosind funcia arra3_$ap/ 0. Pentru aceasta vom utiliza valoarea n*ll
pentru funcia transmis ca parametru. Vom prezenta n continuare un exemplu:
Cod:
<?php
$a = array("unu", "doi", "trei");
$b = array("one", "two", "three");
$c = array("un", "deux", "trois");
$d = array_map(null, $a, $b, $c);
?>
Vectorul $d va avea urmatoarea structura:
Citat:
Array
(
[0] => Array
(
[0] => unu
[1] => one
[2] => un
)
[1] => Array
(
[0] => doi
[2] => two
[3] => deux
)
[2] => Array
(
[0] => trei
[1] => three
[2] => trois
)
)
Funciile array_merge i array_merge_recursive
Aceste funcii realizeaz o "interclasare" a dou sau mai multe tablouri prin adugarea
elementelor unui vector la sfritul tabloului anterior. n cazul n care exist elemente cu
aceeai cheie (reprezentat de un ir de caractere) n tabloul rezultat va aprea un singur
element cu cheia respectiv, i anume primul ntlnit n timpul interclasrii. n cazul n care
cheia identic este reprezentat de un numr, n tabloul rezultat vor aprea ambele valori, dar
valoarea corespunztoare unei chei care apare deja n tablou va avea cheia reprezentat de
cel mai mic numr mai mare dect cheia iniial care nu apare nca n tabloul rezultat.
n cazul n care tablourile conin elemente care sunt tablouri, atunci funcia este
arra3_$erge_re%*rsiCe/ 0 i are ca efect i interclasarea acestor tablouri (care sunt elemente
ale altor tablouri) i procedeul continua recursiv. n cele ce urmeaza vom prezenta un exemplu
care ilustreaz diferenele dintre cele dou funcii.
Cod:
<?php
$v1 = array(
"culoare" => array(
"preferata" => "rosu"),
(5));
$v2 = array(
10,
"culoare" => array(
"preferata" => "verde",
"albastru"));
echo "<PRE>";
print_r(array_merge($v1, $v2));
echo "<br>";
print_r(array_merge_recursive($v1, $v2));
echo "</PRE>";
?>
Funcia array_multisort
Aceast funcie poate fi utilizat pentru a sorta mai multe tablouri sau un tablou
multidimensional. Primul parametru al funciei trebuie s fie un tablou, iar urmtoarele pot fi
tablouri i indicatori de sortare. Fiecare indicator de sortare descrie caracteristici ale sortrii
pentru cel mai apropiat tablou aflat naintea indicatorului n lista de parametri. Exista dou
categorii de indicatori de sortare:
- indicatori de ordine:
- SORT_ASC: sortare n ordine cresctoare;
- SORT_DESC: sortare n ordine descresctoare;
- indicatori de tip:
- SORT_REGULAR: elementele sunt comparate fr a efectua conversii;
- SORT_NUMERIC: elementele sunt comparate dup ce sunt convertite la valori numerice;
- SORT_STRING: elementele sunt comparate dup ce sunt convertite n iruri de caractere.
Pentru un tablou nu pot fi specificai doi indicatori care fac parte din aceeai categorie (de
exemplu, nu este permis specificarea pentru un tablou a indicatorilor SORT_NUMERIC i
SORT_STRING). Nu este obligatorie specificarea ambelor tipuri de indicatori pentru fiecare
tablou. n cazul n care indicatorii lipsesc, sunt utilizate valorile implicite SORT_ASC i
SORT_REGULAR. Tablourile transmise ca parametri sunt considerate a fi coloane ntr-o matrice
care trebuie sortat pe linii. Primul tablou reprezint criteriul de baza. Pentru valori egale n
primul tablou se ia n considerare al doilea criteriu (reprezentat de al doilea tablou). Pentru
valori egale n primele dou tablouri se ia n considerare al treilea criteriu i aa mai departe.
Funcia returneaz o valoare logic ce indic dac operaia de sortare sa ncheiat cu succes.
S considerm doi vectori definii astfel:
$C< = arra3/><Q>. <QQ. <QQ. >a>0E
$C= = arra3/<. B. >=>. <0E
n urma execuiei apelului arra3_$*ltisort/$C<. $C=0E vectorul $v1 va conine elementele
"10", "a", 100 i 100, n timp ce vectorul $v2 va conine elementele 1, 1, "2" i 3. Se observ
c elementele din al doilea vector corespunztoare elementelor cu valori egale din primul
vector (3 i "2" corespund celor dou elemente cu valoarea 100 din primul vector) au fost i
ele sortate.
Vom prezenta acum un exemplu n care vom sorta un tablou bidimensional definit prin:
$C = arra3/arra3/><Q>. <QQ. <QQ. >a>0. arra3/<.B.>=>.<<00E
n urma unui apel de forma:
array_multisort/$C[Q. SORT_AS:. SORT_STR-N1. $C[l. SORT_N5'ER-:. SORT_(ES:0E
prima linie a tabloului va conine elementele "10", 100, 100 i "a" (au fost sortate cresctor ca
iruri de caractere), iar cea de-a doua va conine elementele 1, 3, "2" i 1 (pentru valori egale
n prima linie, elementele de pe a doua au fost sortate descresctor ca valori numerice).
Funcia array_pad
Aceast funcie poate fi utilizat pentru a completa un tablou cu o valoare dat, astfel nct s
aib o dimensiune specificat. Funcia are trei parametri: tabloul care trebuie completat,
dimensiunea pe care trebuie s o aib tabloul completat i valoarea cu care este completat
tabloul. Tabloul va fi completat astfel nct dimensiunea sa s fie egal cu valoarea absolut a
celui deal doilea parametru. n cazul n care valoarea acestui parametru este pozitiv, tabloul
va fi completat la dreapta, iar dac aceasta este negativ, tabloul va fi completat la stnga.
Dac valoarea absolut a acestui parametru este mai mic sau egal cu dimensiunea tabloului
transmis ca parametru, atunci nu sunt adugate elemente. Funcia returneaz tabloul obinut
dup completare.
S considerm vectorul definit prin:
$C = arra3/= . O . J . Y0E
n continuare vom prezenta cteva apeluri ale funciei i vectorii returnai de aceasta:
$r = arra3_pa,/$C=. L. R<0 ! /=. O. J. Y. R<. R<0E
$r = arra3_pa,/$C=. RY. Q0 ! /Q. Q. Q. =. O. J. Y0E
$r = arra3_pa,/$C=. B. J0 ! /=. O. J. Y0E
[nu este adugat nici un element]
Funciile array_pop i array_push
Aceste funcii permit utilizarea tablourilor similar stivelor. Funcia arra3_pop/ 0 este utilizat
pentru a elimina un element al tabloului (ultimul), iar funcia arra3_p*sh/ 0 pentru a aduga n
tablou unul sau mai multe elemente.
S considerm ca vectorul $v este vid. n urma execuiei apelului
array_push( $v , 1 , 2 , 3)
acesta va conine elementele 1, 2 i 3. n acest moment, un apel de forma array_pop($v) va
returna valoarea 3, iar vectorul $v va conine elementele 1 i 2. n cazul n care vectorul
transmis ca parametru este vid, funcia arra3_pop/ 0 returneaz valoarea null. Funcia
arra3_p*sh/ 0 va returna ntotdeauna noua dimensiune a vectorului.
Funciile array_shift i array_unshift
Perechile funciilor arra3_pop/ 0 i arra3_p*sh/ 0 sunt arra3_shi&t/ 0 i arra3_*nshi&t/ 0.
Acestea pot fi utilizate pentru a insera sau elimina elemente la nceputul unui tablou.
Executarea acestor funcii va duce la modificarea cheilor ntregi astfel nct acestea s nceap
de la 0.
Funcia array_rand
Aceast funcie permite alegerea aleatoare a unui numr de elemente dintr-un vector. Funcia
are ca parametri un vector i o valoare numeric ce indic numrul elementelor care vor fi
alese. Acest al doilea parametru poate lipsi, caz n care are valoarea implicit 1. n cazul n
care se alege un singur element, funcia va returna cheia acestuia. n caz contrar, funcia va
returna un tablou care va conine cheile elementelor alese. n continuare este un exemplu
care ilustreaz modul de utilizare a acestei funcii.
Cod:
<?php
$v = array(2, 4, 5, 7);
$a = array_rand($v);
echo "A fost ales elementul a carui cheie este <B>$a</B>.
Valoarea acestui element este <B>$v[$a]</B>.<BR><BR>";
$a = array_rand($v);
echo "A fost ales elementul a carui cheie este <B>$a</B>.
Valoarea acestui element este <B>$v[$a]</B>.<BR><BR>";
$a = array_rand($v, 2);
echo "Au fost alese elementele ale caror chei sunt <B>$a[0]</B> si <B>$
a[1]</B>.
Valorile acestor elemente sunt <B>".$v[$a[0]]."</B> si
<B>".$v[$a[1]]."</B>.<BR><BR>";
$a = array_rand($v, 2);
echo "Au fost alese elementele ale caror chei sunt <B>$a[0]</B> si <B>$
a[1]</B>.
Valorile acestor elemente sunt <B>".$v[$a[0]]."</B> si <B>" .
$v[$a[1]]."</B>.";
?>
Funcia array_reduce
Aceast funcie aplic o alt funcie transmis ca parametru asupra elementelor unui tablou
pn n momentul n care tabloul este redus la o singur valoare. Mai exact, funcia transmis
ca parametru este apelat pentru primele dou elemente ale tabloului. Cele dou elemente
sunt eliminate i n tablou este inserat pe prima poziie rezultatul apelului funciei. Procedeul
continu pn n momentul n care vectorul conine o singur valoare care este returnat.
Exista i posibilitatea de a transmite o valoare iniial pentru efectuarea operaiilor. n acest
caz funcia transmis ca parametru va fi apelat pentru valoarea iniial i primul element al
tabloului. n cazul n care tabloul este vid, rezultatul apelului va fi aceast valoare iniial. S
considerm funciile definite astfel:
&*n%tion S/$C. $90
H
ret*rn $C @ $9E
I
&*n%tion P/$C. $90
H
ret*rn $C @ $9E
I
n urma executrii instruciunilor:
$a = arra3/=. O. J. Y0E
$# = arra3/ 0E
$b = arra3_re,*%e/$a. >S>0 E
$% = arra3_re,*%e/$a. >P>. <Q0 E
$, = arra3_re,*%e/$#. >S>. l0 E
valorile variabilelor $b, $c i $d vor fi 18 (2+4+5+7), 2800 (10*2*4*5*7), respectiv 1
(datorita faptului ca vectorul $x este vid).
Funcia array_reverse
Aceast funcie inverseaz ordinea elementelor unui vector transmis ca parametru. n cazul n
care este prezent un al doilea parametru i valoarea acestuia este TRUE (eventual dup o
conversie), atunci se pstreaz corespondena dintre chei i valori. Funcia returneaz tabloul
obinut dup inversare. S considerm tabloul definit astfel:
$C = arra3/>Pagina>. >,e>. >progra$are>. arra3/>$artie>. =QQO00E
n urma apelurilor $a = arra3_reCerse/$C0 i $b = arra3_reCerse/$C. TR5E0 tablourile $a i $b
vor avea forma prezentat mai jos:
Array
(
[0] => Array
(
[0] => martie
[1] => 2004
)
[1] => programare
[2] => de
[3] => Pagina
)
Array
(
[3] => Array
(
[0] => martie
[1] => 2004
)
[2] => programare
[1] => de
[0] => Pagina
)
Tabloul $a Tabloul $b
Funcia array_search
Aceast funcie verific dac un vector conine un element care are o anumit valoare i, dac
un astfel de element exist, returneaz cheia acestuia. n caz contrar funcia returneaz
valoarea FALSE. Primul parametru al funciei este valoarea cutat, iar al doilea este vectorul
n care este cutata valoarea respectiv. Funcia permite folosirea unui al treilea parametru
care este opional. n cazul n care acesta exist i are valoarea TRUE, atunci n timpul cutrii
se verific i egalitatea tipurilor.
Funcia array_slice
Aceast funcie poate fi utilizat pentru a prelua o poriune a unui tablou. Primul parametru
reprezint tabloul, al doilea reprezint poziia la care ncepe poriunea preluat, iar al treilea
indica numrul elementelor preluate. Aceast funcie ignor cheile elementelor i ia n
considerare pozitiile "reale" ale elementelor n tablou. n cazul n care valoarea celui de-al
doilea parametru este pozitiv, poziia de nceput este determinat relativ fa de nceputul
tabloului. Pentru o valoare negativ, poziia este determinat relativ fa de sfritul tabloului.
n cazul n care valoarea celui de-al treilea parametru este pozitiv, ea va indica numrul
elementelor preluate. Dac ea este negativ, atunci valoarea sa absolut va indica poziia fa
de sfritul vectorului la care se va "opri" preluarea elementelor. Acest parametru poate lipsi,
caz n care sunt preluate toate elementele, pn la sfritul tabloului. Funcia va returna un
tablou care va conine elementele preluate.
n continuare este prezentat modul n care poate fi utilizat aceast funcie pentru a prelua
poriuni ale unui vector.
Cod:
<?php
function DisplayArray($v)
{
echo "<B>";
foreach($v as $val)
{
echo "$val<BR>";
}
echo "</B><BR>";
}
$v = array("a", "b", "c", "d", "e");
echo "<TT>Vectorul initial:";
DisplayArray($v);
echo "array_slice(\$v,2):";
DisplayArray(array_slice($v,2));
echo "array_slice(\$v,2,-1):";
DisplayArray(array_slice($v,2,-1));
echo "array_slice(\$v,-2,1):";
DisplayArray(array_slice($v,-2,1));
echo "array_slice(\$v,0,3):";
DisplayArray(array_slice($v,0,3));
echo "</TT>";
?>
Funcia array_splice
Efectul acestei funcii este similar efectului funciei arra3_sli%e/ 0, diferena constnd n faptul
c poriunea preluat este eliminat din tablou i nlocuit cu elementele unui al patrulea
parametru care reprezint un vector.
Funcia array_sum
Aceast funcie calculeaz suma elementelor unui tablou. n funcie de tipul elementelor,
rezultatul va fi un numr ntreg sau un numr real. Pentru valorile nenumerice se ncearc
efectuarea unei conversii la numere ntregi sau reale i n cazul n care valorile pot fi convertite
(rezultatul conversiei nu este 0) ele sunt luate n considerare n momentul calculrii sumei. De
exemplu, n urma executrii secvenei:
$a = arra3/=. O. L. M0E
e%ho >s*$a/a0 = >.arra3_s*$/$a0.>Zn>E
$b = arra3/>a> =N <.= . >b> =N =.B . >%> =N B.O0E
e%ho >s*$ /b0 = >.arra3_s*$/$b0.>Zn>E
se va afisa:
s*$/a0 = =Q
s*$/b0 = L.K
Funcia array_unique
Aceast funcie elimin dintr-un vector toate valorile care apar de dou sau mai multe ori i
returneaz vectorul obinut n urma eliminrii. Pentru a elimina elementele, funcia le sorteaz
mai nti considerandu-le iruri de caractere. Apoi, pentru fiecare valoare care apare de mai
multe ori, va pstra prima cheie ntlnit n irul sortat.
Funcii de sortare
Interpretorul PHP pune la dispozitie o mulime de funcii care pot fi utilizate pentru a sorta
elementele unui tablou. Acestea sunt (n ordine alfabetic):
- arsort( ) - sorteaz un tablou n ordine descresctoare i pstreaz asocierile dintre indici;
- asort( ) - sorteaz un tablou n ordine cresctoare i pstreaz asocierile dintre indici;
- krsort( ) - sorteaz un tablou n ordine descresctoare n funcie de cheile elementelor
acestuia;
- ksort( ) - sorteaz un tablou n ordine cresctoare n funcie de cheile elementelor acestuia;
- natcasesort( ) - sorteaz un tablou folosind o "ordine natural" fr a face distincie ntre
literele mari i literele mici;
- natsort( ) - sorteaz un tablou folosind o "ordine natural" fcnd distincie ntre literele mari
i literele mici;
- rsort( ) - sorteaz un tablou n ordine descresctoare n funcie de valorile elementelor
acestuia;
- sort( ) - sorteaz un tablou n ordine cresctoare n funcie de valorile elementelor acestuia;
- uasort( ) - sorteaz un tablou folosind pentru comparri o funcie indicat de utilizator i
pstreaz asocierile dintre indici;
- uksort( ) - sorteaz un tablou n funcie de cheile acestuia folosind pentru comparri o
funcie indicat de utilizator;
- usort( ) - sorteaz un tablou folosind pentru comparri o funcie indicat de utilizator.
Toate funciile necesit un parametru care reprezint vectorul care trebuie sortat.
Functiile arsort/ 0. asort/ 0. )rsort/ 0. )sort/ 0. rsort/ 0 i sort/ 0 permit utilizarea unui al doilea
parametru (opional) care este un indicator de tip. Valoarea implicit a acestuia este
SORT_RE15LAR. Al doilea parametru al funciilor *asort/ 0. *)sort/ 0 i *sort/ 0 reprezint
identificatorul funciei care va fi folosit pentru comparare.
Funciile natsort/ 0 i nat%asesort/ 0 nu permit utilizarea unui alt parametru i stabilesc ordinea
aa cum ar face o fiin uman (ordine natural). De exemplu, pentru irurile de caractere
-'1<.1-F. -'1=.1-F. -'1<Q.1-F i -'1<=.1-F, un algoritm "clasic" (bazat pe ordinea
lexicografic) ar stabili ordinea: -'1<. 1-F. -'1<Q .1-F. -'1<= .1-F i -'1= .1-F, dar
algoritmul care foloseste ordinea naturala nu ar efectua nici o modificare.
Funcia compact
Aceast funcie are ca argumente un numr variabil de iruri de caractere sau tablouri. Ea
creeaz un tablou n care va insera toate irurile care reprezint o variabil (aceste iruri vor fi
chei, iar valorile elementelor corespunztoare vor fi valorile variabilelor). n cazul tablourilor,
vor fi luate n considerare toate elementele care sunt iruri de caractere, iar dac tablourile
conin elemente care, la randul lor, sunt tablouri, atunci procedeul se aplic recursiv i asupra
acestora.
Funciile count i sizeof
Aceaste funcii returneaz numarul elementelor unui vector transmis ca parametru. Teoretic,
parametrul poate s nu fie un vector, dar n acest caz se va returna valoarea 1 (doar tablourile
pot conine mai multe elemente). Nu exist nici o diferen ntre aceste funcii.
Funcii pentru elementul curent
Fiecrui vector i este asociat o referin care indic elementul curent. Exist mai multe
funcii care pot utiliza aceast referin. Acestea sunt (n ordine alfabetic):
- current( ) - returneaz valoarea elementului curent al tabloului;
- each( ) - returneaz cheia i valoarea elementului curent i deplaseaz referina la elementul
urmtor; funcia returneaz un tablou cu patru elemente: dou dintre ele au cheile Qi )e3 i
conin cheia elementului; celelalte dou au cheile <i Cal*e i conin valoarea elementului;
- end( ) - deplaseaz referina la ultimul element al tabloului;
- key( ) - returneaz cheia elementului curent al tabloului;
- next( ) - deplaseaz referina la urmtorul element al tabloului;
- pos( ) - returneaz valoarea elementului curent al tabloului (are acelai efect ca i funcia
%*rrent/ 0 );
- prev( ) - deplaseaz referina la elementul anterior al tabloului;
- reset( ) - deplaseaz referina la primul element al tabloului.
Funcia extract
Aceast funcie este utilizat pentru a crea variabile pe baza valorilor elementelor unui vector.
Cheile elementelor vor deveni identificatori de variabile, iar valorile elementelor vor deveni
valorile variabilelor respective. Funcia verific dac cheile reprezint identificatori valizi ai
variabilelor sau dac se ncearc crearea unei variabile care exista deja. Aceste situaii sunt
tratate n funcie de valoarea unui al doilea parametru care reprezint un indicator i este
opional. Valorile posibile pentru acest parametru sunt urmtoarele:
- EXTR_OVERWRITE : dac variabila exist deja, valoarea curenta va fi suprascris;
- EXTR_OVERWRITE : dac variabila exist deja, valoarea curenta nu va fi modificat;
- EXTR_PREFIX_SAME: dac variabila exist deja, denumirea noii variabile va fi prefixat cu
un prefix transmis ca al treilea parametru al funciei;
- EXTR_PREFIX_ALL : denumirile tuturor variabilelor vor fi prefixate;
- EXTR_PREFIX_INVALID : n cazul n care o cheie nu reprezint un identificator de variabil
valid, denumirea cheii va fi prefixat;
- EXTR_IF_EXISTS : nu sunt create variabile noi, ci sunt doar suprascrise valorile variabilelor
care exist deja;
- EXTR_PREFIX_IF_EXISTS : n cazul n care cheia reprezint denumirea unei variabile, se
creeaz o nou variabil prefixat; dac nu exist o astfel de variabil, nu este creat o
variabil nou;
- EXTR_REFS : variabilele create reprezint referine; aadar, prin intermediul lor pot fi
modificate i elementele vectorului; acest indicator poate fi utilizat mpreuna cu oricare dintre
celelalte cu ajutorul unei disjunctii logice.
Cel de-al treilea parametru al funciei trebuie s apar doar dac valoarea celui de-al doilea
este unul din indicatorii ai crui identificator conine secvena PREFIX.
Al doilea parametru poate lipsi, caz n care are valoarea implicit EXTR_OVERWRITE.
Funcia in_array
Aceast funcie este similar funciei arra3_sear%h/ 0, singura diferen fiind faptul c, n cazul
n care cutarea se ncheie cu succes, nu este returnat cheia elementului gsit, ci valoarea
TR5E.
Funcia range
Aceast funcie returneaz un vector care conine toate valorile cuprinse ntre dou limite date
(st i ,r). Primul element al vectorului va avea valoarea st, iar urmtoarele vor avea valorile st
@ <. st @ = etc. dac st S ,r, respectiv st R <. st R = etc. dac st N ,r. ncepnd cu versiunea
PHP 4.4.0 exista i posibilitatea de a crea iruri n care diferena dintre doua elemente s fie
diferit de 1. n cele ce urmeaza este prezentat un document PHP care ilustreaz modul de
utilizare a acestei funcii.
Cod:
<?php
function DisplayArray($v)
{
echo "<B>";
foreach ($v as $val)
{
echo "$val<BR>";
}
echo "</B><BR>";
}
echo "<TT>";
DisplayArray (range(1,10));
DisplayArray (range(10,1));
DisplayArray (range('a', 'k'));
DisplayArray (range('k', 'a'));
echo "</TT>";
?>
Funcia shuffle
Aceast funcie poate fi utilizat pentru a "amesteca" elementele unui tablou. Ea nu
returneaz nici o valoare, dar modific ordinea elementelor tabloului.
Cod:
<?php
function DisplayArray($v)
{
echo "<B>";
foreach ($v as $val)
{
echo "$val<BR>";
}
echo "</B><BR>";
}
echo "<TT>Sirul initial:<BR>&nbsp;";
$a = range(l, 10);
DisplayArray($a);
echo "Sirul amestecat:<BR>&nbsp;";
shuffle($a);
DisplayArray($a);
echo "</TT>";
?>
Lucrul cu fiiere i directoare
ncerc n continuare s v prezint lucrul cu fiiere i directoare (foldere) prin intermediul
scripturilor php. Deoarece va fi un articol destul de lung, l voi mpari n mai multe subcapitole
pentru a putea nelege mai bine ideile prezentate. Voi ncepe n acest articol s va prezint
sistemul de fiiere UNIX (asemntor cu LINUX), apoi voi continua cu vizualizarea informaiilor
despre fiiere, proprietile i privilegiile ce se pot acorda fiierelor sau directoarelor
continund apoi cu exemplificri. n articolele viitoare voi continua cu descrierea funciilor php
de prelucrare a fiierelor i a directoarelor, bineneles cu exemplele aferente. Deci, s ncep:
Sistemul de fiiere UNIX
Pentru a nelege cum trebuie utilizat limbajul PHP pentru a lucra cu fiiere i cataloage,
trebuie s nelegeti sistemul de fiiere UNIX. Acest fapt este valabil chiar dac foloii PHP sub
Microsoft Windows, deoarece modelul folosit de PHP pentru lucrul cu fiiere i directoare este
bazat pe UNIX. Un fiier este o serie de octei stocai pe o unitate de hard-disc, CD-ROM sau
alt mediu de stocare. Fiierele primesc nume pentru a se putea face cu uurin referire la
acestea. Un nume de fiier UNIX poate avea o lungime aproape nelimitat i poate include
aproape orice caracter. Totui pentru compatibilitate nu v recomand s creai fiiere cu nume
mai lungi de 255 de caractere i s nu conin caractere speciale sau diacritice. Spre deosebire
de numele de fiiere Windows, numele de fiiere UNIX sunt sensibile la diferena ntre
majuscule i minuscule; ca atare, index.php i INDEX.PHP se refer la fiiere UNIX diferite.
Sunt sigur c unii dintre voi la nceput cnd puneai fiierele pe server v ntrebai de ce nu
merg anumite pagini dei link-ul era corect i pagina era pus pe server... problema era
diferena dintre majuscule i minuscule. Pentru a evita problemele, mai ales atunci cnd
deplasai fiiere ntre UNIX i Windows, trebuie s folosii minuscule, cifre, puncte, caractere
de subliniere i cratime n numele fiierelor; de asemenea, numele fiierelor trebuie s nceap
cu o minuscul sau cu o cifr.
Vizualizarea informaiilor despre fiiere
Pentru a vizualiza informaii care descriu un fisier, emitei comanda:
ls R< n*$e_&isier
unde nume_fisier este numele fiierului. Datele de ieire includ urmtoarele cmpuri:
- tipul fiierului i permisiunile de acces.
- legturi: numrul legturilor hard asociate acestui fiier. Fiecare legtur hard stabilete un
nume dup care este cunoscut fiierul respectiv. n general putem ignora acest cmp.
- Utilizator: numele utilizatorului care este posesorul fiierului
- Grup: Numele grupului care este posesorul fiierului
- Dimensiunea fiierului exprimat in octei.
- Data modificrii: data i ora ultimei modificri a fiierului. Dac fiierul nu a suferit modificri
recente, vor fi afiate data i anul.
- Numele fiierului: numele atribuit fiierului.
n Windows, o comanda asemntoare ar fi comanda dir. Rulai ntr-un script sub windows
comanda urmtoare:
Cod:
<?php
$comanda = `dir`;
//pentru ghilimele folositi tasta de langa 1
// deasupra tastei tab nu caracterul asta '.
echo $comanda;
?>
Pentru a funciona aceast comand trebuie introdus n ghilimele simple ` (a nu se folosi
ghilimelele ' )
Proprietatea asupra fiierelor
Fiecare fiier are un cont de utilizator asociat, cunoscut sub numele de posesor al fiierului.
Putei determina posesorul unui fiier prin emiterea comenzii ls. Utilizatorul care creeaz un
fiier devine posesorul fiierului. Cu toate acestea, un administrator de sistem poate atribui un
fiier unui alt utilizator, prin emiterea comenzii chown (este i comand php).
Administratorii de sistem UNIX pot defini gr*p*ri ,e *tili;atori, sau pur i simplu gr*p*ri, care
reprezint seturi de utilizatori. Un utilizator poate fi membru al unui numr orict de mare de
grupuri. Posesorul unui fiier poate atribui unui fiier un nou grup posesor prin emiterea
comenzii %hgrp:
%hgrp gr*p n*$e_&isier
unde n*$e_&isier este numele fiierului, iar gr*p este numele grupului. n afar de calitatea de
posesor al fiierului, utilizatorul care emite comanda trebuie s fie un membru al grupului
gr*p.
Privilegii de fiier
Privilegiile asociate unui fiier determin operaiile pe care utilizatorii le pot efectua cu fiierul
respectiv. Privilegiile sunt date sub forma a trei grupuri alctuite din cte trei caractere
fiecare; cu alte cuvinte, trei triade. Prima triad indic privilegiile acordate posesorului
fiierului. Cea de-a doua triad indic privilegiile acordate membrilor grupului care este
posesorul fiierului. Cea de-a treia triad indic privilegiile acordate altor utilizatori, cu alte
cuvinte, persoanelor care nu sunt nici posesoare ale fiierului i nici nu sunt membre ale
grupului care care este posesorul fiierului. Fiecare caracter al unei triade de privilegii poate fi
o liter sau o cratim. Literele au urmtoarele semnificaii:
- r, fiierul poate fi citit
- w, se poate scrie n fiier
- x, coninutul fiierului poate fi executat.
Privilegiul x este semnificativ numai pentru fiierele care includ un coninut executabil, cum
sunt fiierele binare executabile sau anumite categorii de scripturi. Caracterele unei triade
apar ntotdeauna n secvena rwx. Daca o anumit liter este nlocuit de o cratim, privilegiul
asociat nu este utilizabil. De exemplu, avem un fiier cu privilegiile urmtoare:
r9#rR#rRR
Aceste caractere au urmtoarea semnificaie:
- rwx, posesorul fiierului poate citi, scrie sau executa fiierul
- r-x, membrii grupului posesor al fiierului pot citi sau executa fiierul, dar nu pot scrie n
fiier
- r--, alti utilizatori pot citi fiierul, dar nu pot scrie n fiier sau executa coninutul fiierului.
Posesorul unui fiier poate modifica privilegiile asociate fiierului emind comanda %h$o,.
Aceast comand are dou forme. O form v permite s specificai privilegiile folosind cifre
scrise n octal; cealalt v permite s le specificai folosind litere. Pentru a specifica privilegiile
folosind cifre n octal, calculai valoarea numeric a fiecrei triade. Pentru aceasta, nsumai
numerele corespunztoare fiecrui privilegiu disponibil din cadrul triadei. Numerele asociate
privilegiilor sunt:
r- 4
w - 2
x - 1
De exemplu, privilegiul r9# are valoarea O@=@< = Y. Similar, privilegiul rR# are valoarea O@<
= J, iar privilegiul rRR are valoarea O. Dup ce ai calculat valoarea numeric a fiecrei triade,
formai un numr din trei cifre scris n octal. De exemplu, privilegiile r9#rR#rRR corespund
valorii n octal YJO. Forma comenzii chmod care foloseste cifre n octal este urmtoarea:
%h$o, $o, n*$e_&isier
unde mod este numrul din trei cifre scris n octal care indic privilegiile, iar nume_fisier este
numele fiierului cruia urmeaz a i se aplica privilegiile. De exemplu, pentru a acorda
posesorului acces complet la fiierul test i pentru a acorda altor utilizatori numai acces de
citire, emitei comanda:
%h$o, YOO test
Majoritatea utilizatorilor gsesc mai comod utilizarea acelei forme a comenzii chmod care le
permite specificarea privilegiilor folosind litere. Aceast form alternativ v permite s
specificai privilegii, precum i s adaugai sau s extrageti privilegii dintr-un fiier.
%h$o, *tili;atori operatie priCilegii
ntre argumentele comenzii nu sunt permise spaii. Argumentul *tili;atori include ntre una i
trei dintre urmtoarele litere:
- u, care indic utilizatorul posesor al fiierului
- g, care indic pe membrii grupului posesor al fiierului
- o, care indic utilizatori alii dect posesorul i membrii grupului posesor.
Argumentul operatie este unul din urmtoarele:
- r, fiierul poate fi citit
- w, n fiier este permis scrierea
- x, coninutul fiierului poate fi executat
Se pot specifica mai muli utilizatori, mai multe operaii i mai multe grupuri; fiecare
specificaie trebuie separat de urmtoarea cu ajutorul unei virgule. De exemplu, iat o
comand care atribuie privilegiile rwxr--r-- pentru fiierul test:
chmod u=rwx,g=r,o=r test
Iat o comand care retrage privilegiile de scriere fiecrui utilizator, cu excepia posesorului
fiierului, respectiv aduga privilegiile de executare la privilegiile posesorului fiierului:
%h$o, *@#.goR9 test
Aceast comand nu modific nici privilegiile de citire i de scriere ale posesorului fiierului,
nici privilegiile de citire i de execuie ale celorlati utilizatori.
Sistemele UNIX furnizeaz un cont special de utilizator, denumit ra,a%ina (root) sau s*perR
*tili;ator (s*per*ser), care poate obine acces la fiiere i le poate manipula fr nici un fel de
restricii. Administratorul unui sistem este, n general, singura persoan autorizat s utilizeze
contul rdcin. Uneori, administratorii de sistem folosesc numeroase privilegii speciale astfel
c pot aprea i alte privilegii n afar de r,w i x.. De exemplu, un privilegiu special, cunoscut
sub numele de setuid, modific temporar identitatea utilizatorului deintor al acestui privilegiu
care ruleaza un fiier program. Asemenea privilegii speciale nu sunt, n general, folosite de
programatorii aplicaiilor PHP.
Crearea unui director (folder sau catalog)
Pentru a crea un director, invocai funcia $),ir/0, care are urmtoarea form:
$),ir/n*$e_,ire%tor. $o,0
unde n*$e_,ire%tor este calea absolut sau relativ
(O cale absolut este calea care ncepe de la directorul rdcin urmnd structura
arborescent a directoarelor i sub-directoarelor acestuia pn se ajunge la directorul dorit.
Fiecare director din list este separat de directorul urmtor de un caracter slash orientat
nainte (/). Calea relativ se refer la calea unui fiier sau director ncepnd de la directorul
curent de lucru.
De exemplu, dac fiierul in,e#.php se afl n directorul "ho$e"t*toriale"arti%ole i dorim s
includem n el un alt fiier numit test.php aflat cu un director mai sus l putem accesa relativ la
locaia prezent astfel .."test.php0
sau numele directorului care urmeaz a fi creat, iar mod atribuie privilegiile care trebuie
acordate noului director. n mod normal, prima cifr a argumentului mod trebuie s fie 0,
astfel ncat PHP s-l perceap ca pe o valoare scris n octal. Funcia returneaza tr*e dac
creeaz directorul; n caz contrar, returneaz &alse. De exemplu, pentru a crea un director
denumit "test" i pentru a-i atribui privilegiile "rwxr-x--x", invocai functia $),ir/0 astfel:
$),ir/>test>. QYJ<0
Putei folosi funcia rena$e/0 pentru a modifica numele unui director.
tergerea unui director
Pentru a terge un director, se folosete funcia r$,ir/0, transferndu-i ca argument calea sau
numele directorului care urmeaz a fi ters. De exemplu, pentru a terge directorul
"ho$e"t*toriale"teste"Ce%hi", invocai funcia r$,ir/0 astfel:
r$,ir/>ho$e"t*toriale"teste"Ce%hi>0
Se pot sterge numai directoare vide. Funcia va returna zero n cazul producerii unei erori.
Privilegii pentru directoare
Ca i fiierele, directoarele au privilegii asociate. Privilegiile unui director se noteaz folosind
aceleai litere care indic privilegiile fiierelor; cu toate acestea, literele au semnificaii
oarecum diferite atunci cnd se aplic asupra directoarelor:
- r, directorul poate fi citit; cu alte cuvinte, sub-directoarele i fiierele pe care le conine pot fi
afiate
- w, directorul poate fi scris; cu alte cuvinte, sub-directoarele i fiierele pe care le conine pot
fi create n catalog i apoi terse de acolo.
- x, directorul se poate folosi, cu alte cuvinte, sub-directoarele i fiierele pe care le conine
sunt accesibile.
Vizualizarea i modificarea privilegiilor de director
Putei invoca funcia %h$o,/0, folosind ca argument un fiier sau un director. Putei vedea
privilegiile de director utiliznd funcia &ileper$s/0.
Obinerea i modificarea directorului de lucru
Functia get%9,/0 returneaz un ir care conine directorul curent de lucru. Funcia nu necesit
argumente i, implicit, poate fi utilizat astfel:
$,ire%tor_%*rent = get%9,/0E
Pentru a schimba directorul curent de lucru, invocai funcia %h,ir/0, care are urmtoarea
form:
%h,ir/n*$e_,ire%tor0
unde n*$e_,ire%tor este calea sau numele directorului de lucru dorit. Funcia returneaz tr*e
dac operaia reuete; n caz contrar, returneaz &alse. De exemplu, pentru a face din "teste
directorul curent de lucru, invocai funcia %h,ir/0 dup cum urmeaz:
$s%hi$ba_,ir = %h,ir/>"teste>0E
i& /7$s%hi$ba_,ir0 H ,ie/>SbrNA apar*t o eroare la s%hi$barea ,ire%tor*l*i %*rent ,e
l*%r*.>0 I
Manipularea cilor de acces
Funcia ,irna$e/0 preia calea de acces la un fiier i returneaz toat calea, mai puin
componenta final a cii specificate. n cazul n care componenta final este un fiier, funcia
v ajut s izolai numele fiierului de restul cii. De exemplu, dac se d calea
"ho$e"t*toriale"teste"test.php", funcia va returna "ho$e"t*toriale"teste". Funcia are
urmtoarea form:
,irna$e/%ale0
Funcia basena$e/0 execut operaia complementar, returnnd numai componenta final a
cii specificate. De exemplu, dac este dat calea "ho$e"t*toriale"teste"test.php", funcia va
returna "test.php". Funcia are urmtoarea form:
basena$e/%ale0
Dac dorii s executai mai multe operaii cu o cale, funcia pathin&o/0 v poate fi de folos.
Aceast funcie returneaz un tablou asociativ care include trei elemente: rezultatul invocrii
funciei ,irna$e/0 avnd ca argument calea respectiv, rezultatul invocrii funciei
basena$e/0 avnd ca argument calea respectiv, precum i extensia fiierului (dac exist)
asociat rezultatului invocrii funciei basena$e/0 avnd ca argument calea respectiv. Iat
un exemplu care prezint modul de utilizare a funciei pathin&o/0:
Cod:
<?php
$info = pathinfo("/home/tutoriale/teste/test.php");
foreach ($info as $nume=>$valoare)
{ echo "<br>$nume => $valoare"; }
?>
Datele de ieire ale exemplului vor fi:
Citat:
dirname => /home/tutoriale/teste
basename => test.php
extension => php
Versiunea PHP 4.04pl1 ii ncheie execuia dac invocai funcia pathin&o/0 pe o cale din care
lipseste extensia fiierului. Se pare c acest defect de program a fost remediat n versiunea
PHP 4.05
Citirea coninutului unui director
PHP furnizeaz trei funcii care v permit s citii coninutul unui director, ca i cum directorul
ar fi un fiier. Aceste funcii sunt:
- open,ir/0, care permite citirea unui director
- rea,,ir/0, care citeste o intrare dintr-un director
- %lose,ir/0, care nchide directorul, elibernd resursele alocate de funcia open,ir/0
Rezultatul apelrii funciei rea,,ir/0 este un ir care conine numele urmtorului fiier sau sub-
director al directorului deschis. Funcia returneaz &alse atunci cnd au fost citite toate intrrile
din catalog. Exemplu:
Cod:
<?php
$director = opendir("/home/tutoriale/teste");
if (!$director)
{
die("A aparut o eroare la deschiderea directorului");
}
$citire = readdir($director);
while ($citire)
{
echo "<br>$citire";
$citire = readdir($director);
}
closedir($director);
?>
Acest exemplu afieaz coninutul directorului ""ho$e"t*toriale"teste" (att sub-directoarele
ct i fiierele)
Obinerea atributelor unui fiier
PHP furnizeaz numeroase funcii care v permit s obinei informaii care descriu un fiier.
Tabelul de mai jos rezum cele mai cunoscute dintre aceste funcii.
Funcie Descriere
file_exists() returneaz tr*e dac fiierul specificat exist, respectiv &alse n caz contrar.
fileatime() returneaz timpul de acces la fiier sub form de amprent de timp UNIX
filectime()
returneaz timpul de modificare al i-nodului (structura de date care conine
informaii despre fiierele UNIX) sub form de amprent de timp UNIX
filegroup() returneaz identificatorul numeric al grupului care deine fiierul
filemtime()
returneaz momentul de timp al modificrii fiierului sub form de amprent de
timp UNIX.
fileowner() returneaz identificatorul numeric de utilizator al fiierului
fileperms() returneaz permisiunile fiierului <;/tr>
filesize() returneaz dimensiunea fiierului, n octei.
filetype()
returneaz tipul fiierului, n spe "&i&o", "%har", ",ir", "blo%)", "lin)", "&ile" sa*
"*n)no9n".
is_dir()
returneaz tr*e dac fiierul specificat exist i este un director, n caz contrar
returneaz &alse
is_file()
returneaz tr*e dac fiierul specificat exist i este un fiier obinuit; n caz
contrar, returneaz &alse.
is_readable()
returneaz tr*e dac fiierul specificat exist i poate fi citit, n caz contrar
returneaz &alse.
is_writable()
returneaz tr*e dac fiierul specificat exist i se poate scrie n acel fiier; n caz
contrar, returneaz &alse.
Funciile &ileo9ner/0 i &ilegro*p/0 returneaz fiecare un identificator numeric; putei converti
identificatorul numeric ntr-un ir prin invocarea funciei posi#_getp9*i,/0 cu un identificator
de utilizator, respectiv a funciei posi#_getgrgi,/0 cu un identificator de grup. Un exemplu al
acestor funcii este dat mai jos.
Cod:
<?php
$nume_fisier = "pagina_demo.php";
$rezultat = file_exists($nume_fisier);
echo "<br>file_exists(): $rezultat";
$rezultat = posix_getpwuid(fileowner($nume_fisier));
$rezultat = $rezultat["name"];
echo "<br>fileowner(): $rezultat";
$rezultat = posix_getgrgid(filegroup($nume_fisier));
$rezultat = $rezultat["name"];
echo "<br>filegroup(): $rezultat";
$rezultat = filetype($nume_fisier);
echo "<br>filetype(): $rezultat";
$rezultat = filesize($nume_fisier);
echo "<br>filesize(): $rezultat";
$rezultat = fileatime($nume_fisier);
$rezultat = date("m-d-Y H:i", $rezultat);
echo "<br>fileatime(): $rezultat";
$rezultat = filectime($nume_fisier);
$rezultat = date("m-d-Y H:i", $rezultat);
echo "<br>filectime(): $rezultat";
$rezultat = filemtime($nume_fisier);
$rezultat = date("m-d-Y H:i", $rezultat);
echo "<br>filemtime(): $rezultat";
$rezultat = fileperms($nume_fisier);
$rezultat = decoct($rezultat);
echo "<br>fileperms(): $rezultat";
$rezultat = is_file($nume_fisier);
echo "<br>is_file(): $rezultat";
$rezultat = is_dir($nume_fisier);
echo "<br>is_dir(): $rezultat";
$rezultat = is_readable($nume_fisier);
echo "<br>is_readable(): $rezultat";
$rezultat = is_writable($nume_fisier);
echo "<br>is_writable(): $rezultat";
?>
Modificarea privilegiilor unui fiier
Pentru a modifica privilegiile unui fiier, invocai %h$o,/0, o funcie ale crui argumente sunt
asemnatoare celor folosite n linia de comand UNIX:
%h$o,/n*$e_&isier. $o,0
unde n*$e_&isier specific numele sau calea de acces a fiierului ale crui privilegii urmeaz a
fi modificate, iar argumentul $o, specific privilegiile dorite. n general se prefer exprimarea
privilegiilor sub forma unui numr scris n octal. Pentru aceasta, prefixai valoarea folosind
cifra 0. De exemplu, valoarea literal 010 are valoarea 8, nu valoarea 10. Ca atare, puteti
atribui unui fiier privilegiile rw-r----- specificnd valoarea 0640. Pentru ca funcia %h$o,/0 s
se execute cu succes, PHP trebuie s ruleze sub contul utilizatorului posesor al fiierului.
Funcia returneaz tr*e n caz de reuit, respectiv &alse n caz contrar. Funcia %h$o,/0 nu
funcioneaz sub Windows.
Modificarea proprietii asupra unui fiier
Pentru a modifica grupul posesor al unui fiier, invocai funcia %hgrp/0, care are forma:
%hgrp/n*$e_&isier. gr*p0
unde n*$e_&isier este numele sau calea fiierului, iar gr*p este numele sau identificatorul
numeric al grupului. Pentru ca funcia s se execute cu succes, contul de utilizator sub care
ruleaz PHP trebuie s fie posesor al fiierului i s fie membru al grupului specificat de
argumentul gr*p. Funcia returneaz tr*e n caz de reuit, respectiv &alse n caz contrar.
Funcia %hgrp/0 nu funcioneaz sub Windows. Dei PHP include o funcie %ho9n/0 care
modific proprietatea asupra unui fiier, PHP trebuie s ruleze folosind contul rdcin pentru
ca aceast funcie s poat da rezultate. Deoarece acesta este un procedeu nesigur i rareori
folosit, n general funcia %ho9n/0 nu este disponibil.
Deschiderea unui fiier
nainte de a putea citi sau scrie ntr-un fiier, trebuie s deschidei fiierul folosind funcia
&open/0:
&open/n*$e_&isier. $o,0
unde n*$e_&isier specific numele sau calea spre fiierul care urmeaz a fi deschis, iar $o,
indic tipul de acces dorit. De exemplu, instruciunea urmtoare deschide fiierul te#t.t#t
pentru citire:
$&isier = &open/>te#t.t#t>. >r>0E
Funcia &open/0 returneaz valoarea &alse dac PHP nu a reuit s deschid fiierul. n caz
contrar, aceast valoare conine un ntreg care se numete i,enti&i%ator ,e &iTier, care se
folosete pentru identificarea unui fiier de ctre funciile care execut operaii cu fiiere.
Tabelul de mai jos prezint valorile argumentului $o, care pot fi transmise funciei &open/0.
Literele care desemneaz modurile corespund cuvintelor rea, (citire), 9rite (scriere) i appen,
(adugare). Modul "r" permite accesul la citire. Modurile "9" i "a" permit accesul la scriere.
Modurile care includ semnul >@> permit ambele tipuri de acces. Unele moduri determin PHP
s ncerce a crea fiierul, dac acesta nu exist.
Mod Citire Scriere Creare Trunchiere Pointer
"r" x nceput
"r+" x x nceput
"w" x x x nceput
"w+" x x x x nceput
"a" x x Sfrit
"a+" x x x Sfrit
Pentru ca funcia &open/0 s se execute cu succes, PHP trebuie s ruleze sub contul unui
utilizator care dispune de suficiente privilegii pentru a executa operaiile indicate de modul
respectiv. De exemplu, pentru a putea crea un fiier, PHP trebuie s ruleze ca utilizator cu
acces de scriere la catalogul n care urmeaz a fi creat fiierul.
Fiecare fiier are un pointer asociat, care indic amplasarea octetului din fiier unde se va
produce urmtoarea operaie (citire sau scriere). Valoarea modului funciei &open/0 determin
valoarea iniial a pointerului de fiier. PHP furnizeaz o form alternativ a funciei &open/0,
care preia trei argumente:
&open/n*$e_&isier. $o,. %ale0E
Dac argumentul %ale are valoarea "<", PHP va cuta fiierul ntr-un director special, denumit
cale de includere. Administratorul PHP configureaz identitatea cii de includere. Dac
specificai argumentul cale, argumentul n*$e_&isier trebuie s fie alctuit dintr-un nume de
fiier sau o cale relativ, nu dintr-o cale absolut.
n mod prestabilit, PHP 4.04pl1 raporteaz c este configurat calea de includere. Cu toate
acestea, este necesar stabilirea manual a valorii variabilei in%l*,e_path din fiierul php.ini;
n caz contrar, calea de includere nu va fi folosit.
Sub Windows, fiierele ASCII i fiierele binare sunt tratate n mod diferit. Cnd deschidei un
fiier binar sub Windows, specificai "b" ca al doilea caracter al modului; de exemplu, "rb".
Dac nu procedai astfel, citirile din fiier i alte operaii se vor ncheia prematur sau vor eua.
Verificarea finalizrii unei operaii cu un fiier
Operaiile cu fiiere pot eua dintr-o varietate de motive. Deci, este important s verificai
dac fiecare operaie s-a ncheiat cu succes. Iat o modalitate n care putei verifica:
Cod:
<?php
$fisier = fopen("text.txt", "r");
if (!$fisier) { die("Nu se poate deschide fisierul pentru citire"); }
?>
Funcia &open/0 returneaz &alse dac nu reuete s deschid fiierul. n acest caz, scriptul
invoc funcia ,ie/0 pentru a afia un mesaj i pentru a-i ncheia execuia. Cu mult mai
compacte, dar i posibil mai derutante, sunt formele folosite de programatorii PHP cu
experien:
Cod:
<?php
$fisier = fopen("text.txt", "r") or die("Nu se poate deschide fisierul
pentru citire");
?>
sau aceeai instruciune mai complex:
Cod:
<?php
($fisier = fopen("text.txt", "r")) || die("Nu se poate deschide fisierul
pentru citire");
?>
nchiderea unui fiier
Un fiier deschis consum resursele sistemului. Cnd un script a terminat de utilizat un fiier,
scriptul trebuie s nchid fiierul, elibernd aceste resurse. La sfritul unui script, PHP
inchide n mod automat fiierele deschise. Totui, n programare se recomand s nchidei
fiierele mai rapid, ori de cte ori este posibil. Pentru a nchide un fiier invocai funcia
&%lose/0:
&%lose/i,enti&i%ator_&isier0
unde i,enti&i%ator_&isier este identificatorul fiierului, returnat la deschiderea acestuia. De
exemplu: <;br>
Cod:
<?php
$fisier = fopen("text.txt", "r");
if (!$fisier)
{ die("Nu se poate deschide fisierul"); }
// Aici se introduc instructiunile care folosesc fisierul deschis
@fclose($fisier);
?>
Funcia &%lose/0 returneaz valoarea tr*e dac fiierul a fost nchis cu succes. Testarea acestei
valori este rareori necesar, deoarece nu se mai pot face prea multe dup ce s-a ratat o
ncercare de a nchide un fiier.
Citirea dintr-un fiier
PHP furnizeaz o varietate de funcii pentru citirea fiierelor. Prima dintre acestea este &rea,/0
care are urmtoarea form:
&rea,/i,enti&i%ator_&isier. l*ngi$e0
Argumentul i,enti&i%ator_&isier este valoarea returnat de funcia fopen/0, iar argumentul
l*ngi$e specific numrul maxim de octei care vor fi citii. Octeii citii din fiier sunt returnai
sub form de valoare de tip ir. Dac operaia de citire ntlnete sfritul fiierului, PHP va
returna mai puin de l*ngi$e octei. PHP include o funcie conex, denumit &get%/0, care
citete un octet din fiierul specificat. Exemplu:
Cod:
<?php
$fisier = fopen("text.txt", "r") OR die("Nu se poate deschide fisierul
pentru citire");
$citire = fread($fisier, 256);
echo "<br>Citeste: $citire";
fclose($fisier);
?>
Exemplul citete maximum 256 de octei din fiier. Pentru a citi un numr mai mare sau mai
mic de octei, modificai valoarea argumentului l*ngi$e al funciei &rea,/0. Pentru a citi i a
afisa ntregul coninut al fiierului, folosii funcia &ilesi;e/0 pentru a furniza valoarea
argumentului l*ngi$e, astfel:
Cod:
<?php
$nume_fisier = "text.txt";
$fisier = fopen($nume_fisier, "r") OR die("Nu se poate deschide fisierul
pentru citire");
$citire = fread($fisier, filesize($nume_fisier));
echo "<br>Citeste: $citire";
fclose($fisier);
?>
Citirea unei linii de text
O linie de text este o serie de caractere urmate de un caracter de terminare a liniei. Funcia
&gets/0 citete o linie dintr-un fiier. Funcia are urmtoarea form:
&gets/i,enti&i%ator_&isier. l*ngi$e0
Ca i n cazul funciei &rea,/0, argumentul i,enti&i%ator_&isier este o valoare returnat de
funcia &open/0; cu toate acestea, argumentul l*ngi$e specific numrul maxim de octei care
vor fi citii, minus o unitate, pentru a permite includerea caracterului de terminare a liniei.
Octei citii din fiier sunt returnai ca valoare de tip ir. n exemplul urmtor este prezentat
modul de citire i de afiare a primei linii a unui fiier:
Cod:
<?php
$nume_fisier = "text.txt";
$fisier = fopen($nume_fisier, "r") OR die("Nu se poate deschide fisierul
pentru citire");
$citire = fgets($fisier, 256);
echo "<br>Citeste: $citire";
fclose($fisier);
?>
n exemplul de mai sus s-a presupus c linia cea mai lung a fiierului conine mai puin de
256 octei. Pentru a permite lungimi de linie mai mari, modificai valoarea argumentului
l*ngi$e al funciei &gets/0.
Citirea linie cu linie a unui ntreg fiier
Funcia &eo&/0 este folosit pentru a determina momentul cnd fiierul a fost citit n totalitate.
Funcia returneaz o valoare care arat dac s-a ajuns sau nu la sfritul fiierului. Funcia are
urmtoarea form:
&eo&/i,enti&i%ator_&isier0
Argumentul i,enti&i%ator_&isier este valoarea returnat de funcia &open/0. Funcia &eo&/0
returneaz tr*e dac fiierul specificat este la sfrit; n caz contrar returneaz &alse. Iat cum
se poate folosi funcia &eo&/0 pentru a controla procesul de citire a unui ntreg fiier, linie cu
linie:
Cod:
<?php
$nume_fisier = "text.txt";
$fisier = fopen($nume_fisier, "r") OR die("Nu se poate deschide fisierul
pentru citire");
$citire = fread($fisier, filesize($nume_fisier));
while (!feof($fisier))
{
echo "<br>Citeste: $citire";
$citire = fread($fisier, filesize($nume_fisier));
}
fclose($fisier);
?>
Instruciunea 9hile asigur faptul c funcia &gets/0 este apelat n mod repetat, pn la
citirea tuturor liniilor.
O modalitate mai simpl de a citi linie cu linie un ntreg fiier const n a folosi funcia &ile/0.
Aceast funcie returneaz un tablou n care fiecare element conine o linie a fiierului text
specificat. Iat un exemplu:
Cod:
<?php
$tablou = file("text.txt");
foreach ($tablou as $citire)
{
echo "<br Citeste: $citire";
}
?>
Aceast metod nu este adecvat pentru fiiere de foarte mari dimensiuni, deoarece n tablou
este ncrcat ntregul coninut al fiierului, ceea ce poate necesita o cantitate de memorie
superioar celei disponibile.
Afiarea coninutului unui fiier
PHP furnizeaz dou funcii care faciliteaz afiarea coninutului unui fiier. Una dintre funcii,
&passthr*/0, necesit un argument care specific identificatorul fiierului care urmeaz s fie
afiat:
$&isier = &open/>te#t.t#t>. >r>0E
&passthr*/$&isier0E
Dup ce a afiat fiierul, funcia l nchide automat. Cealalt funcie, rea,&ile/0, necesit numai
numele sau calea fiierului:
rea,&ile/>te#t.t#t>0E
Navigarea printr-un fiier
Aa cum am mai spus, fiecare fiier are un pointer asociat care indic poziia octetului unde se
va produce urmtoarea operaie. Putei folosi funcia re9in,/0 pentru a readuce pointerul la
nceputul fiierului. Funcia are urmtoarea form:
re9in,/i,enti&i%ator_&isier0
unde i,enti&i%ator_&isier este identificatorul de fiier returnat de funcia &open/0. Nu se poate
readuce pointerul unui fiier la nceputul propriu-zis al unui fiier dac fiierul a fost deschis
pentru un acces de tip ataare, adic ntr-unul din modurile "a" sau "a+". Dac se produce o
eroare, funcia re9in,/0 returneaz ;ero. Dei funcia re9in,/0 este util n caz de nevoie,
necesitatea de a readuce un pointer de fiier la nceputul fiierului nu este chiar att de
frecvent. Funcia &see)/0 furnizeaz o mai mare flexibilitate, permindu-v s poziionai
pointerul de fiier astfel nct s putei citi sau scrie n orice punct al fiierului. Funcia are
dou forme, cea mai simpl fiind urmtoarea:
&see)/i,enti&i%ator_&isier. o&&set0
unde i,enti&i%ator_&isier este identificatorul de fiier returnat de funcia &open/0, iar o&&set este
poziia dorit a pointerului de fiier, specificat n octei, n raport cu nceputul fiierului. n caz
de reuit, funcia &see)/0 returneaz 0; n caz contrar, returneaz -1. O form alternativ a
funciei asigur un grad superior de flexibilitate:
&see)/i,enti&i%ator_&isier. o&&set. ba;a0
unde baza ia una dintre urmtoarele valori:
- SEEK_SET, care stabilete poziia pointerului de fiier n raport cu nceputul fiierului
- SEEK_CUR, care stabilete poziia pointerului de fiier n raport cu valoarea curent a
pointerului
- SEEK_END, care stabilete poziia pointerului de fiier relativ la sfritul fiierului.
Valoarea argumentului o&&set poate fi po;itiCU, negatiCU sau ;ero. De exemplu, pentru a
poziiona pointerul cu 10 octei nainte de sfritul fiierului, emitei urmtorul apel de funcie:
&see)/$&isier. R<Q. SEE[_EN(0
unde $&isier este identificatorul fiierului al crui pointer dorii s-l repoziionai.
Pentru a obine valoarea curent a pointerului de fiier, invocai functia &tell/0, care are
urmtoarea form:
&tell/i,enti&i%ator_&isier0
Funcia returneaz valoarea curent a identificatorului de fiier, respectiv valoarea zero dac
funcia eueaz.
Scrierea ntr-un fiier
Spre deosebire de varietatea de funcii furnizate pentru citirea fiierelor, PHP ofer o singur
funcie pentru scrierea n fiiere, i anume &9rite/0, care are urmtoarea form:
&9rite/i,enti&i%ator_&isier. ,ata0
unde i,enti&i%ator_&isier este identificatorul de fiier returnat de funcia &open/0, iar ,ata este o
valoare ir care determin datele ce urmeaz a fi scrise. Dac execuia funciei reuete,
returneaz numrul octeilor scrii; n caz contrar, returneaz valoarea -1. Iat un exemplu de
scriere a datelor ntr-un fiier:
Cod:
<?php
$nume_fisier = "text.txt";
$fisier = fopen($nume_fisier, "a") OR die("Nu se poate deschide fisierul
pentru citire");
$scriere = fwrite($fisier, "Un rand de text atasat la fisier.\n");
echo "<br>Rezultatul scrierii: $scriere";
fclose($fisier);
?>
Scriptul scrie n fiier o linie de text. Deoarece fiierul a fost deschis folosind modul "a", datele
sunt ataate la fiier; cu alte cuvinte, datele sunt scrise dup toate datele existente n fiier.
Dac lucrai cu fiiere text, n general trebuie s includei un caracter de terminare a liniei la
sfritul fiecrei linii scrise n fiier (n exemplul de mai sus am pus \n la sfritul liniei).
Scriptul din exemplul de mai sus scrie n fiier o singur linie de text. Totui, putei scrie mai
multe linii, dac dorii. Dac apelai funcia &9rite/0 din interiorul unei bucle, avei posibilitatea
s scriei mai multe linii. Dup ce ai scris toate liniile de care avei nevoie, nchidei fiierul
prin apelarea funciei &%lose/0. PHP mai furnizeaz i o form alternativ a funciei &9rite/0:
&9rite/i,enti&i%ator_&isier. ,ata. l*ngi$e0
Aceast form include un al treilea argument, i anume l*ngi$e, care v permite s specificai
numrul maxim de octei care vor fi scrisi. Argumentul lungime trebuie utilizat atunci cnd se
scrie n fiiere binare sub Windows. De asemenea, Windows prefer secvena de terminare a
liniei "\r\n". PHP dispune de o alt funcie pentru scrierea fiierelor, n spe &p*ts/0. Totui, n
afar de nume, &p*ts/0 este una i aceeai funcie cu &9rite/0 (reprezint una i aceeai funcie
dar cu nume diferite).
Obinerea accesului exclusiv la un fiier
Uneori, accesul simultan la un fiier poate avea ca rezultat deteriorarea fiierului. S ne
imaginm c avem un contor de pagini asociat unei pagini web. Dac 2 sau mai muli vizitatori
intr simultan pe pagin scriptul de contorizare va deschide fiierul pentru scriere n acelai
timp pentru toi utilizatorii i ce credei c va scrie n el? n loc s incrementeze contorul cu o
unitate pentru fiecare vizitator este posibil sa dea eroare i informaiile din fiier s se piard.
Pentru a evita astfel de probleme, este necesar ca fiecare proces s obin acces exclusiv la
fiierul care conine contorul din pagin. Astfel, accesul la fiier este succesiv: fiierul va fi
folosit mai nti de un proces, i apoi de cellalt. Atta vreme ct procesele sunt mpiedicate
s obin simultan accesul la fiier, contorul nu va indica valori eronate. Funcia &lo%)/0
permite unui proces s obin un acces exclusiv la un fiier, acordnd procesului o blocare a
fiierului. Funcia are forma:
&lo%)/i,enti&i%ator_&isier. operatie0
unde i,enti&i%ator_&isier este identificatorul de fiier returnat de funcia &open/0. Argumentul
operatie este o constant sau o expresie care specific operaia dorit, dup cum urmeaz:
Operaie Descriere
LOCK_SH
Obine o blocare partajat a fiierului specificat. Mai multe procese
pot deine o blocare partajat; pentru un fiier ns, nici un proces
nu poate obine o blocare partajat n timp ce un alt proces deine
o blocare exclusiv. Procesul va atepta pn cnd are posibilitatea
de a obine blocarea cerut.
LOCK_EX
Obine o blocare exclusiv pentru fiierul specificat. Un singur
proces poate deine o blocare exclusiv a unui fiier. Procesul va
atepta pn cnd are posibilitatea de a obine blocarea cerut.
LOCK_SH + LOCK_NB
ncearc s obin o blocare partajat a fiierului specificat; totui,
nu ateapt obinerea blocrii, dac aceasta nu este disponibil
imediat.
LOCK_EN + LOCK_NB
ncearc s obin o blocare exclusiv pentru fiierul specificat;
totui, nu ateapta obinerea blocrii, dac aceasta nu este
disponibil imediat.
LOCK_UN Elibereaz blocarea fiierului specificat.
Funcia &lo%)/0 returneaz tr*e n caz de reuit, respectiv &alse cnd blocarea solicitat nu
poate fi obinut (LO:[_SH i LO:[_EG) sau eliberat (LO:[_5N). Blocarea este o activitate
care se desfoar n comun. Procesele nu au niciodat accesul interzis la fiiere, ci numai la
blocri. Ca atare, un proces care nu ncearc s blocheze un fiier poate obine acces la fiier
chiar dac un alt proces a cerut i a obinut o blocare exclusiv a fiierului. Unele servere Web,
inclusiv IIS de la Microsoft, ruleaz un singur proces multifir. n asemenea situaii, funcia
&lo%)/0 nu va reui s furnizeze acces exclusiv la fiiere.
Copierea unui fiier
PHP furnizeaz o funcie care faciliteaz copierea fiierelor, i anume funcia %op3/0. Funcia
%op3/0 are urmtoarea form:
%op3/s*rsa. ,estinatie0
unde s*rsa este numele sau calea fiierului care urmeaz a fi copiat, iar ,estinatie este
numele sau calea unde se va copia. Funcia returneaz tr*e dac operaia de copiere reueste;
n caz contrar, returneaz &alse. Exemplu:
Cod:
<?php
$copiaza = copy("text.txt", "text.bak");
if (!$copiaza) { die("<br>A fost produsa o eroare la copierea fisierulu
i"); }
?>
Exemplul creaz o copie de siguran a fiierului >te#t.t#t>, cu numele >te#t.ba)>. PHP trebuie
s aib acces de scriere la directorul n care se va afla copia; n caz contrar, PHP nu va putea
crea copia. Funcia %op3/0 va suprascrie fiierul destinaie, dac acesta exist.
Modificarea numelui unui fiier
PHP furnizeaz o funcie care v permite s modificati numele unui fiier, i anume rena$e/0,
funcie care are urmtoarea form:
rena$e/n*$e_Ce%hi. n*$e_no*0
unde n*$e_Ce%hi este numele sau calea original a fiierului, iar nume_nou este numele sau
calea dorit. Funcia returneaz tr*e dac operaia de modificare a numelui a reuit; n caz
contrar, returneaz &alse. Exemplu:
Cod:
<?php
$redenumeste = rename("text.bak", "text.txt");
if (!$redenumeste) { die("<br>A fost produsa o eroare la redenumirea fi
sierului"); }
?>
Exemplul modific numele fiierului "te#t.ba)", atribuindu-i numele "te#t.t#t". La fel ca la
funcia %op3/0, PHP trebuie s aib acces de scriere la directorul n care se va afla fiierul cu
numele modificat; n caz contrar, PHP nu va putea modifica numele fiierului. Ca i n cazul
comenzii UNIX $C, funcia rena$e/0 va suprascrie fiierul destinaie, dac acesta exist.
tergerea unui fiier
PHP furnizeaz o funcie care v permite s tergei un fiier, i anume *nlin)/0. Funcia are
forma:
*nlin)/n*$e_&isier0
unde n*$e_&isier este numele sau calea fiierului care urmeaz a fi ters. Funcia returneaz
tr*e dac operaia de tergere a avut succes, respectiv &alse n caz contrar. Exemplu:
Cod:
<?php
$sterge = unlink("text.txt");
if (!$sterge) { die("<br>A fost produsa o eroare la stergerea fisierulu
i"); }
?>
Reinei c PHP trebuie s aib acces de scriere la directorul n care se afl fiierul; n caz
contrar, PHP nu va putea terge fiierul. n conformitate cu manualul PHP, functia *nlin)/0 "s-
ar putea s nu funcioneze" n sistemele Windows.
ncrcarea unui fiier n server
Pe anumite pagini cu formulare HT'L se poate ncrca un fiier pe server. Pentru a crea un
astfel de formular de ncrcare, specificai EN:TXPE=>$*ltipart"&or$R,ata> n eticheta FOR' i
includei un control de introducere a datelor cu atributul TXPE=>F-LE>. Iat un exemplu:
Cod:
<HTML>
<HEAD>
<TITLE>incarcare fisier</TITLE>
</HEAD>
<BODY>
<FORM METHOD="POST" ACTION="incarca.php" ENCTYPE="multipart/form-data">
Incarca un fisier: <INPUT NAME="fisier_utilizator" TYPE="FILE">
<BR><BR>
<INPUT TYPE="SUBMIT" VALUE="Trimite">
</FORM>
</BODY>
</HTML>
Cnd utilizatorul apas pe butonul de trimitere, browserul ncarc fiierul n server. Scriptul
vostru PHP poate obine accesul la calea fiierului ncrcat astfel:
$HTTP_POST_F-LES[>&isier_*tili;ator>[>t$p_na$e>
unde &isier_*tili;ator este valoarea atributului NA'E asociat controlului -NP5T folosit pentru
ncrcarea fiierului. La terminarea execuiei scriptului, PHP terge n mod automat fiierul
ncrcat. Dac dorii s salvai fiierul, putei invoca funcia $oCe_*ploa,e,_&ile/0. De
exemplu:
Cod:
<?php
$rezultat = move_uploaded_file ($HTTP_POST_FILES["fisier_utilizator"]
["tmp_name"],
"/home/tutoriale/upload/nume_fisier.ext");
$rezultat = $rezultat ? "true" : "false";
echo "<br>move_uploaded_file(): $rezultat";
?>
Funcia $oCe_*ploa,e,_&ile/0 v impune s specificai calea fiierului ncrcat i calea unde
dorii s fie mutat fiierul. Funcia returneaz tr*e dac operaia reuete, respectiv &alse n
caz contrar.
Momentan m opresc aici cu prima parte a acestui tutorial, sper c ai aflat lucruri interesante
pn acum.
Descrierea funciilor de prelucrare a fiierelor
n articolul precedent am discutat despre sistemul de fiiere si am generalizat despre fisiere si
directoare. n continuare o s ncerc sa detaliez lucrul cu fiierele i s discut ceva mai mult
despre cele mai folosite funcii care se ocup de fiiere. Limbajul PHP ofer un set de funcii
pentru a facilita accesul la coninutul fiierelor. Sintaxa majoritii dintre acestea este similar
funciilor de manipulare a fiierelor prezente n limbajul C/C ++. Datorit faptului c limbajul
PHP este independent de platform, printre numele funciilor se regsesc i nume cunoscute
pe platformele de operare \ni# i 'i%roso&t Fin,o9s.
Funcia fopen
Aceast funcie se folote pentru deschiderea unui fiier n vederea citirii sau scrierii datelor
din/n acesta. Funcia are patru parametri, dintre care ultimii doi sunt opionali. Primul
parametru l reprezint numele fiierului care urmeaz a fi deschis. Fiierul poate fi i unul
aflat la distan. Un fiier este recunoscut de PHP a fi la distan dac este accesibil printr-unul
dintre protocoalele FTT2 /F3per Te#t Trans&er 2roto%ol0. FTT2+ /+e%*re FTT20. BT2 /Bile
Trans&er 2roto%ol0 sau BT2+ /+e%*re BT20. Fiierele standard de intrare i ieire pot fi
accesate folosind urmtorii identificatori:
- php://stdin - fiierul standard de intrare pentru procesul curent creat de PHP;
- php://stdout - fiierul standard de ieire pentru procesul curent creat de PHP;
- php://stderr - fiierul standard de erori pentru procesul curent creat de PHP;
- php://input - cu ajutorul acestui identificator se poate accesa coninutul datelor transmise
paginii prin intermediul metodei POST;
- php://output - cu ajutorul acestui identificator se pot scrie date direct n pagina web.
Fiierele php!""inp*t i php!""st,in pot fi deschise numai n scopul citirii, n timp ce fiierele
php!""o*tp*t, php!""st,o*t i php!""st,err pot fi deschise numai pentru scriere. Scrierea
datelor n fiierul php!""o*tp*t are acelai efect ca i utilizarea funciilor print i e%ho.
Cel de-al doilea parametru este de tipul ir de caractere i reprezint modul de deschidere a
fiierului care poate fi:
-"r" - deschide fiierul pentru citire i poziioneaz pointer-ul la nceputul acestuia;
-"r+" - deschide fiierul pentru citire i scriere i poziioneaz pointer-ul la nceputul acestuia;
-"w" - deschide fiierul pentru scriere, poziioneaza pointer-ul la nceputul acestuia i sterge
coninutul; dac fiierul nu exist, acesta este creat.
-"w+ " - deschide fiierul pentru citire i scriere, poziioneaz pointer-ul la nceputul acestuia i
sterge coninutul; dac fiierul nu exist, acesta este creat.
-"a" - deschide fiierul pentru scriere i poziioneaz pointer-ul la sfritul acestuia, ns fr a
terge coninutul; dac fiierul nu exist, acesta este creat.
- "a+" - deschide fiierul pentru citire i scriere i poziioneaz pointer-ul la sfritul acestuia,
ns fr a terge coninutul; dac fiierul nu exist, acesta este creat.
La sfritul irului care reprezint modul de deschidere a fiierului mai poate aprea i
caracterul "b". Acesta este util atunci cnd se dorete deschiderea fiierului n mod binar i nu
n mod text. Pe sistemele de operare \ni# nu are nici un efect, n schimb pentru portabilitate
este indicat folosirea lui. Cel de-al treilea parametru este de tip ntreg i poate avea valorile 0
sau 1 i indic funciei faptul c se poate folosi (valoarea 1) sau nu (valoarea 0) lista de
directoare, cu care interpretorul a fost configurat, pentru a gsi fiierul care se dorete a fi
deschis, n cazul n care numele acestuia nu include i o cale absolut. Cel de-al patrulea
parametru este de tipul reso*r%e i este folosit n scopul optimizrii unor operaii. Funcia
&open returneaz un numr ntreg care reprezint identificatorul de acces la fiierul care
tocmai a fost deschis. Acest identificator va fi transmis tuturor funciilor pe care le vei utiliza
pentru a accesa date din fiier. n cazul n care deschiderea fiierului nu poate avea loc din
diferite motive, atunci funcia returneaz valoarea logic FALSE. De exemplu, pentru a
deschide fiierul cu numele "test.t#t" pentru a citi date, vom folosi urmtoarea linie de cod
sursa:
$& = &open/>test.t#t>. >r>0;
Dac dorim s scriem date n fiier, atunci l putem deschide folosind urmtorul cod:
$& = &open/>test.t#t>. >9>0E
Funcia tmpfile
Aceast funcie realizeaz crearea i deschiderea unui fiier temporar pentru scriere i citire.
Funcia t$p&ile nu are parametri i returneaz un numr ntreg care reprezint identificatorul
de acces al fiierului temporar. Fiierul temporar va fi ters n mod automat n momentul n
care este nchis sau cnd script-ul i ncheie execuia. Apelul acestei funcii este identic cu cel
al funciei &open cu parametrii: un nume de fiier temporar (de obicei generat aleator) i
"9@b" ca mod de deschidere a fiierului.
Functia fclose
Aceast funcie realizeaz nchiderea unui fiier care a fost deschis cu ajutorul funciilor &open
sau t$p&ile. Funcia &%lose are un singur parametru de tip ntreg, care reprezint identificatorul
de acces la fiierul care se dorete a fi nchis. Funcia returneaz valoarea logic TR5E dac
nchiderea fiierului a reuit i valoarea logica FALSE n caz contrar. Un exemplu de apel al
acestei funcii este
&%lose/$&,0
unde &, reprezint identificatorul de acces la fiierul care se dorete a fi nchis.
Funcia feof
Aceast funcie verific dac s-a ajuns la sfritul fiierului sau nu. Funcia feof are un singur
parametru de tip ntreg, care reprezint identificatorul de acces la fiierul care se dorete a fi
nchis. Funcia returneaz valoarea logic TR5E dac am ajuns la sfritul fiierului i valoarea
logic FALSE n caz contrar.
Funciile fscanf
Aceast funcie citete date dintr-un fiier text i are doi parametri obligatorii. Primul
parametru este de tip ntreg i reprezint identificatorul de acces la fiierul din care se face
citirea, iar cel de-al doilea parametru este de tipul ir de caractere i indic funciei formatul
intrrii. Formatul acestuia din urm este similar formatului folosit pentru funcia &s%an&
prezent n limbajul C/C++. Ceilali parametri reprezint referinele la variabilele care vor
conine rezultatul citirii. Funcia returneaz un vector cu valorile citite, deci prezena
variabilelor nu mai este obligatorie ca n cazul limbajului C/C++. De exemplu, dac din fiierul
>%!Ztest.t#t> dorim s citim un numr i un ir de caractere separate printr-un spaiu, atunci
vom folosi urmtorul cod:
Cod:
<?php
$f = fopen("c:\\test.txt","r");
$rez = fscanf($f, "%d %s \n");
list($nr, $sir) = $rez;
fclose($f);
echo "Am citit numarul: ".$nr."<BR>";
echo "si sirul: ".$sir;
?>
Funcia fread
Aceast funcie se folosete pentru citirea datelor din fiiere binare. Pentru compatibilitate cu
toate sistemele de operare se recomand ca la deschiderea fiierului, pentru citire, s se
adauge caracterul "b" la parametrul care reprezint modul de deschidere a fiierului. Funcia
&rea, are doi parametri obligatorii. Primul parametru este de tip ntreg i reprezint
identificatorul de acces al fiierului din care se dorete s se citeasc date, iar al doilea
parametru, tot de tip ntreg, reprezint numarul de octei care se doresc a fi citii. Rezultatul
returnat de aceast funcie este de tip ir de caractere care este format din octeii care s-au
citit din fiierul de intrare. n cazul n care n fiierul din care se citesc date nu mai este
disponibil numrul de octei specificat n cadrul celui de-al doilea parametru, atunci funcia
returneaz toi octeii disponibili de la poziia curent din fiier i pn la sfritul acestuia. n
continuare este un exemplu de folosire a acestei funcii. Codul este compatibil cu toate
sistemele de operare pe care limbajul PHP poate fi instalat.
Cod:
<?php
$fis = "test.txt";
$fd = fopen($fis, "rb");
$continut = fread($fd, filesize($fis));
fclose($fd);
echo "Continutul fisierului este: ";
echo $continut;
?>
Funcia fgetc
Aceast funcie citete urmtorul caracter disponibil din fiierul de intrare. Funcia are un
singur parametru de tip ntreg care reprezint identificatorul de acces la fiierul din care se
dorete s se fac citirea. Funcia &get% returneaz un ir de caractere, n cazul n care nu s-a
ajuns la sfritul fiierului, format dintr-un singur caracter, i anume, cel citit din fiier. n
cazul n care ne aflm la sfritul fiierului, funcia &get% returneaz valoarea logic FALSE.
Cod:
<?php
$fisier = "test.txt";
$fd = fopen($fisier,"r");
$car = fgetc($fd);
fclose($fd);
echo "Primul caracter din fisier este: ";
echo $car;
?>
Funcia fgets
Aceast funcie se folosete pentru a citi o linie dintr-un fiier de tip text. Sintaxa acestei
funcii este similar cu cea a funciei &rea,, cu meniunea c cel de-al doilea parametru este
opional. Funcia &gets returneaz un ir de caractere care conine datele citite. Citirea datelor
din fiier se ncheie n momentul n care s-a citit un numr de caractere egal cu valoarea celui
de-al doilea parametru (n cazul n care acesta este prezent), n momentul ntlnirii unui sfrit
de linie sau n momentul n care s-a ajuns la sfritul fiierului. n cazul n care ne aflm la
sfritul fiierului, funcia &gets returneaz valoarea logic FALSE.
Cod:
<?php
$fisier = "test.txt";
$fd= fopen($fisier,"r");
$linie = fgets($fd);
fclose($fd) ;
echo "Prima linie din fisier este: ";
echo $linie;
?>
n acest exemplu am omis cel de-al doilea parametru.
Funcia fgetss
Aceast funcie citete o linie dintr-un fiier HT'L. Spre deosebire de funcia &gets, funcia
&getss are trei parametri. Primii doi parametri sunt identici cu cei folosii n cazul funciei &gets.
Cel de-al treilea parametru este opional, este de tip ir de caraetere i reprezint o list de
marcaje HT'L sau PHP pe care funcia nu trebuie s le elimine n momentul citirii. Aceast
funcie returneaz un ir de caractere care reprezint datele din fiierul HT'L care au fost
citite. Citirea datelor se ncheie n momentul n care s-au citit attea caractere cte indic cel
de-al doilea parametru sau n momentul n care am ajuns la sfritul fiierului.
Cod:
<?php
$fis = "test.html";
$fd = fopen($fis, "r");
echo "Continutul fisierului HTML este: ";
while (!$linie = fgetss($fd, filesize($fis)))
{
echo $linie."<br>";
}
fclose($fd);
?>
n cazul n care fiierul test.html conine multe linii cu marcaje html, prin eliminarea lor, irul
returnat devine vid, iar pe ecran se vor afia multe rnduri goale.
Funcia fgetcsv
Aceast funcie citete date dintr-un fisier :SV (:o$$a Separate, Val*es R Calori separate
prin Cirg*la). Un fiier de tip :SV are formatul text i conine mai multe nregistrri. Este o
reprezentare textuala a unui fiier de tip tabelar. Pe fiecare linie a unui astfel de fiier se afl
mai multe valori ale unor cmpuri care sunt delimitate printr-un separator. De obicei acest
separator este caracterul " , " (virgula), de unde i numele acestui tip de fiier. Funcia &get%sC
are trei parametri dintre care primii doi sunt obligatorii. Primul parametru este de tip ntreg i
reprezint identificatorul de acces la fiierul de intrare, al doilea parametru este de tip ntreg i
reprezint numrul maxim de octei care se vor procesa la o citire i trebuie s aib o valoare
mai mare dect lungimea celei rnai mari linii din fiierul :SV, iar al treilea parametru este de
tip ir de caractere care trebuie s aib lungimea 1 i reprezint separatorul care se va folosi
la procesarea datelor. Funcia returneaz, n cazul n care nu ne aflm la sfritul fiierului de
intrare, un tablou de iruri de caractere care reprezint valorile citite. n cazul n care ne aflm
la sfritul fiierului, funcia &get%sC returneaz valoarea logic FALSE. n continuare este
prezentat un exemplu de utilizare a acestei funcii pentru un fiier CSV n care fiecare linie nu
are o lungime mai mare de 1000 de caractere:
Cod:
<?php
$lin = 1;
$fp = fopen("test.csv", "r");
while ($date = fgetcsv($fp, 1000, ","))
{
$num = count($date);
echo "<p>$num campuri pe linia $lin: <br>";
$lin++;
for ($c=0; $c<$num; $c++)
{
echo $date[$c]."<br>";
}
}
fclose($fp);
?>
Funcia file_get_contents
Aceast funcie citete coninutul unui fiier de tip text i are doi parametri. Primul parametru
este de tip ir de caractere i reprezint numele fiierului al crui coninut se va citi, iar cel de-
al doilea parametru este opional i indic dac pentru gsirea fiierului se va folosi sau nu
lista de directoare predefinit. Funcia returneaz un ir de caractere care conine toate datele
din fiierul primit ca parametru n cazul n care citirea s-a efectuat cu succes i valoarea logic
FALSE n caz contrar.
Funcia file
Aceast funcie citete coninutul unui fiier de tip text i are aceeai sintax cu funcia
&ile_get_%ontens, dar rezultatul returnat de aceasta este un tablou de iruri de caractere,
fiecare dintre acestea constnd ntr-o linie din fiierul primit ca parametru.
Funcia filetype
Aceast funcie returneaz un ir de caractere care reprezint tipul unui fiier. Funcia &ilet3pe
are un singur parametru de tip ir de caractere, mai exact numele fiierului pentru care dorim
s determinm tipul. Valorile posibile pentru tipul unui fiier sunt >pipe>. >&i&o>. >%har>. >,ir>.
>blo%)>. >lin)>. >&ile>. Ti >*n)no9n>.
Funcia filesize
Aceast funcie se foloeste pentru a afla dimensiunea, exprimat n octei, a unui fiier.
Funcia &ilesi;e are un singur parametru de tip ir de caractere, mai exact numele fiierului
pentru care dorim s determinm dimensiunea.
Funcia fwrite
Aceast funcie se folosete pentru a scrie date ntr-un fiier text sau binar. Pentru
compatibilitate cu toate sistemele de operare, se recomand ca la deschiderea fiierului,
pentru scriere, s se adauge caracterul "b" la parametrul care reprezint modul de deschidere
a fiierului. Funcia &9rite are trei parametri. Primul parametru este de tip ntreg i reprezint
identificatorul de acces la fiierul n care se dorete s se scrie date, cel de-al doilea parametru
este de tip ir de caractere i reprezint datele care se vor scrie n fiier, iar cel de-al treilea
parametru este de tip ntreg, opional i reprezint numrul de octei din irul de caractere
care se vor scrie n fiier. Funcia returneaz un numr ntreg care reprezint numrul de
octei pe care a reuit s-i scrie n fiier, n cazul n care nu au aprut erori i valoarea logic
FALSE n caz contrar. n continuare este un exemplu de utilizare a acestei funcii:
Cod:
<?php
$fis = "test.txt";
$sir = "Scriere in fisier";
$fp = fopen($fis, "a");
fwrite($fp, $sir);
echo "Am scris ($sir) in fisierul ($fis).";
fclose($fp);
?>
Funcia fputs
Aceast funcie este o redenumire a funciei &9rite, pentru compatibilitate cu limbajul C/C++,
i are acelai comportament. n limbajul C/C++ functia &9rite este folosit pentru a scrie un
ir de octei ntr-un fiier, spre deosebire de PHP, unde irul de octei este reprezentat chiar de
irul de caractere.
Funcia fflush
Aceast funcie foreaz salvarea pe disc a coninutului zonelor tampon folosite pentru scrierea
ntr-un fiier. Funcia &&l*sh primete un singur parametru de tip ntreg, care reprezint
identificatorul de acces al fiierului pentru care se dorete golirea zonelor tampon. Funcia
returneaz valoarea logic FALSE n caz de eroare i valoarea logic TR5E n caz contrar .
Funcia flock
Aceast funcie se foloeste pentru a bloca sau debloca accesul la un fiier. Necesitatea
utilizrii funciei &lo%) apare n momentul n care mai multe procese doresc s acceseze acelai
fiier i nu se vrea afectarea integritii acestuia. Funcia are trei parametri. Primul parametru
reprezint identificatorul de acces la coninutul fiierului, cel de-al doilea parametru reprezint
tipul operaiei de blocare a fiierului, iar al treilea parametru este de tip referin la ntreg i va
primi valorea logic TR5E n cazul n care funcia &lo%) va opri execuia script-ului pn n
momentul n care va reui s blocheze fiierul. Pentru cel de-al doilea parametru, n limbajul
PHP sunt disponibile constantele:
- LOCK_SH - se folosete n cazul n care fiierul se blocheaza n mod partajat pentru citirea
datelor;
- LOCK_EX - se folosete n cazul n care fiierul se blocheaza n mod exclusiv pentru scrierea
datelor;
- LOCK_UN - se folosete n cazul n care se dorete deblocarea unui fiier;
- LOCK_NB - se folosete mpreun cu una dintre primele trei constante dac nu se dorete ca
funcia &lo%) s ntrerup execuia script-ului pn n momentul n care va reui s efectueze
operaia cerut; aceast constant se adun la una dintre primele trei.
Funcia returneaz valoarea logic TR5E n caz de succes i valoarea logic FALSE n cazul
unui eec.
Funcia fseek
Aceast funcie se folosete pentru modificarea poziiei de citire sau scriere n interiorul unui
fiier. Funcia &see) are trei parametri. Primul parametru este de tip ntreg i reprezint
identificatorul de acces la un fiier, al doilea parametru este de tip ntreg i indic numrul de
poziii cu care se va face modificarea, iar al treilea parametru, tot de tip ntreg, este opional i
specific modul n care se va face modificarea. Se observ c cel de-al doilea parametru poate
avea i valori negative. Modificarea poziiei de citire sau scriere se poate face n trei moduri
pentru care sunt definite constante:
- relativ la nceputul fiierului - constanta SEEK_SET;
- relativ la pozitia curent - constanta SEEK_CUR;
- relativ la sfritul fiierului - constanta SEEK_SET.
n cazul n care cel de-al treilea parametru lipseste se va folosi ca valoare pentru acesta
constanta SEE[_SET. Funcia returneaz o valoare ntreag egal cu 0, n cazul n care nu au
aparut erori, i egal cu -1 n caz contrar. Aceast funcie nu poate fi folosit pentru fiiere
care sunt accesate folosind unul dintre protocoalele HTTP sau FTP.
Funcia rewind
Aceast funcie schimb poziia de citire sau scriere ntr-un fiier la nceputul acestuia i are
un singur parametru care specific identificatorul de acces la fiier. Rezultatul returnat de
funcia re9in, este acelai cu cel returnat de funcia &see). Apelul acestei funcii este
echivalent cu apelul funciei &see) cu primul parametru avnd ca valoare identificatorul de
acces al fiierului, al doilea parametru avnd valoarea 0 i cel de-al treilea parametru avnd
valoarea SEE[_SET chiar dac lipsete.
Funcia ftell
Aceast funcie se folosete pentru a afla poziia curent de la care se va face urmtoarea
citire sau scriere ntr-un fiier, relativ la nceputul acestuia. Funcia &tell primete ca parametru
identificatorul de acces al fiierului pentru care se aplic i returneaz o valoare ntreag
reprezentnd poziia din fiier, n caz de succes sau valoarea logic FALSE n caz de eec.
Funcia ftruncate
Aceast funcie realizeaz redimensionarea fiierului cu o valoare primit ca parametru.
Funcia &tr*n%ate are doi parametri. Primul dintre acetia este identificatorul de acces al
fiierului care se redimensioneaz, iar al doilea parametru este de tip ntreg i reprezint noua
dimensiune a fiierului. Trebuie inut cont de faptul ca n cazul n care cel deal doilea
parametru are o valoare mai mare dect dimensiunea curent a fiierului, va fi alocat, pe disc,
spaiu suplimentar care nu va fi iniializat. n cazul n care cel de-al doilea parametru are o
valoare mai mica dect dimensiunea curent a fiierului, atunci toate datele din fiier, care se
afl dup poziia indicat de noua valoare, se vor pierde.
Funcia delete
Aceast funcie este mai degrab o redenumire a funciei *nlin), care se folosete pentru a
terge un fiier de pe disc. Funcia ,elete a fost inclus n pachetul de funcii oferit de limbajul
PHP pentru cei care au programat n limbaje precum Pascal i nu au avut la dispoziie funcia
unlink. Funcia *nlin) primete ca parametru un nume de fiier i returneaz valoarea logic
TR5E n cazul n care tergerea s-a efectuat cu succes. n cazul n care tergerea nu s-a putut
efectua, funcia returnez valoarea logic FALSE.
n urtorul articol o s ncerc s detaliez funciile php care se ocup de manipularea
directoarelor.
Funcii care faciliteaza lucrul cu directoare
n articolele anterioare am discutat despre structura de fisiere i felul cum sunt ele salvate pe
server i am detaliat funciile php care se ocup de fiiere. n acest articol se afl descrierea
celor mai importante funcii i clase oferite de limbajul PHP pentru manipularea directoarelor.
Funcia getcwd
Aceast funcie returneaz un ir de caractere care reprezint directorul curent. Funcia
get%9, nu are nici un parametru. n continuare este un exemplu de utilizare al acestei funcii:
Cod:
<?php
$cdir = getcwd();
echo "Directorul curent este: ".$cdir;
?>
Funcia chdir
Aceast funcie se folosete pentru a schimba directorul curent i primete ca parametru un ir
de caractere care reprezint noul director. Funcia %h,ir returneaz valoarea logic TR5E
atunci cnd schimbarea directorului curent s-a efectuat cu succes i valoarea logic FALSE n
caz contrar.
Funcia chroot
Aceast funcie se folosete pentru a schimba directorul rdcin pentru procesul curent i
primete ca parametru un ir de caractere care reprezint noul director rdcin. Funcia
%hroot returneaz valoarea logic TR5E atunci cnd schimbarea directorului rdcin s-a
efectuat cu succes i valoarea logic FALSE n caz contrar. Aceast funcie nu este
implementat pe platformele de operare Microsoft Windows i nu este recomandat folosirea
ei decat n cazul n care interpretorul PHP este utilizat folosind metoda de execuie :1-.
Functia opendir
Aceasta functie se foloseste pentru a deschide un director in scopul citirii continutului sau.
Functia opendir are un singur parametru de tip sir de caractere care reprezinta numele
directoruiui al carui continut se va prelucra. Aceasta functie returneaza un identificator de
acces la continutul directorului si este de tipul resursa. In cazul in care nu se reuseste
deshiderea directorului,
functia returneaza valoarea logica FALSE.
Funcia closedir
Aceast funcie se folosete pentru a nchide un director care a fost deschis pentru citire
folosind funcia open,ir. Funcia %lose,ir are un singur parametru de tipul resurs, care
reprezint identificatorul de acces al directorului care se doreste a fi nchis. Aceast funcie nu
returneaz nici o valoare, ea avnd tipul Coi,.
Funcia readdir
Funcia rea,,ir se folosete pentru a citi urmtoarea intrare disponibil ntr-un director. Ea are
un singur parametru de tip resurs, care reprezint identificatorul de acces al directorului din
care se va citi. Funcia rea,,ir returneaz un ir de caractere reprezentnd numele urmtoarei
intrri din director, n cazul n care nu am ajuns la sfritul acestuia sau nu au aparut erori i
valoarea logic FALSE n caz contrar. n continuare este un exemplu de utilizare a funciilor
opendir, readdir i closedir:
Cod:
<?php
$dir = "E:\\";
$dh = opendir($dir);
echo "Continutul directorului $dir<BR>";
while (false!==($fis=readdir($dh)))
{
echo "$fis<BR>";
}
closedir($dh);
?>
Funcia rewinddir
Aceast funcie reseteaz poziia curent dintr-un director, i anume, dac dup un anumit
numr de citiri este apelat aceast funcie i dup aceeea se mai citete o intrare din
directorul respectiv, atunci se va returna prima intrare din director. Funcia are un singur
parametru de tipul resurs, care reprezint identificatorul de acces al directorului din care se
va citi i nu returneaz nici o valoare.
Clasa dir
Aceast clasa ncapsuleaz funciile open,ir, %lose,ir, rea,,ir i re9in,,ir. Structura acesteia
este urmtoarea:
Cod:
class dir
{
dir (string directory)
string path
resource handle
string read (void)
void rewind (void)
void close (void)
}
Constructorul clasei ,ir primete ca parametru un ir de caractere care reprezint numele
directorului care se va citi i apeleaz funcia open,ir. Funciile rea,, re9in, i %lose din cadrul
acestei clase au acelai comportament cu funciile rea,,ir, re9in,,ir, respectiv %lose,ir i se
deosebesc de acestea prin simplul fapt c nu mai au parametri, deoarece identificatorul de
acces la director este de asemenea ncapsulat n cadrul clasei ,ir. n continuare este prezentat
un exemplu de utilizare a acestei clase care reprezint implementarea cu clase a exemplului
anterior:
Cod:
<?php
$d = dir("E:\\");
echo "Continutul directorului $d -> path <BR>";
while (false !== ($fis = $d -> read()))
{
echo "$fis<BR>";
}
$d -> close();
?>
Funcia mkdir
Aceast funcie se folosete pentru a crea un director nou i primete ca parametru un ir de
caractere care reprezint numele directorului care se va crea i atributele acestuia (parametru
de tip ntreg) n format *nix. Funcia returneaz valoarea logic TR5E n caz de succes i
valoarea logic FALSE n caz de eec.
Funcia rmdir
Aceast funcie se folosete pentru a terge un director de pe disc i primete ca parametru un
ir de caractere care reprezint numele directorului care va fi ters. Directorul care se dorete
a fi ters trebuie s nu conin nici un fiier sau subdirector. Funcia returneaz valoarea logic
TR5E n caz de succes i valoarea logic FALSE n caz de eec.
Funcia basename
Aceast funcie returneaz numele de baz al unui fiier sau director sub forma unui ir de
caractere. Funcia are doi parametri de tip ir de caractere. Primul parametru reprezint o cale
ctre un fiier sau director, iar al doilea este opional i reprezint sufixul fiierului. n
continuare este prezentat un exemplu de utilizare a acestei funcii:
Cod:
<?php
$cale= "c:\\test.html";
echo "Numele fisierului cu sufix:<BR>";
echo basename($cale)."<BR>";
echo "Numele fisierului fara sufix: <BR>";
echo basename($cale,".html");
?>
Funcia dirname
Aceast funcie returneaz numele directorului printe al unui fiier sau director sub forma
unui ir de caractere. Funcia are un singur parametru de tip ir de caractere care reprezint o
cale ctre un fiier sau director. n continuare este un exemplu de utilizare a acestei funcii:
Cod:
<?php
$cale = "c:\\test.html";
echo "Directorul parinte pentru ";
echo $cale." este ".dirname($cale);
?>
Funcia pathinfo
Aceasta funcie se folosete pentru a afia informaii referitoare la o cale ctre un fiier sau
director. Funcia pathin&o primete ca parametru un ir de caractere care reprezint calea
ctre un fiier sau director. Funcia returneaz un tablou ale crui valori sunt de tipul ir de
caractere i care conine elementele " ,irna$e ", "basena$e" i "e#tension". Elementele
",irna$e" i "basena$e" au valori identice cu cele returnate de funciile cu acelasi nume, iar
elementul "e#tension" conine extensia fiierului. Exemplu:
Cod:
<?php
$cale = "c:\\test.html";
$info = pathinfo($cale);
echo "Informatii despre $cale:<BR>";
echo "Director: ";
echo $info["dirname"]."<BR>";
echo "Nume fisier: ";
echo $info["basename"]."<BR>";
echo "Extensie: ";
echo $info["extension"]."<BR>";
?>
Funcia file_exists
Aceast funcie se folosete pentru a determina dac un fiier exist sau nu pe disc. Funcia
&ile_e#ists are un singur parametru de tip ir de caractere care reprezint numele fiierului
pentru care se verific existena fizic pe disc. Funcia returneaz valoarea logic TR5E n caz
de succes i valoarea logic FALSE n caz de eec. Aceast funcie nu poate fi folosit pentru
fiiere aflate la distan dect dac sunt partajate de pe o platform Microsoft Windows pe
care a fost configurat componenta File an, Print Sharing sau dac sunt partajate pe o
platform \ni# pe care a fost instalat pachetul Sa$ba.
Funcia copy
Aceast funcie se folosete pentru a copia un fiier i are doi parametri de tip ir de caractere.
Primul dintre acetia reprezint numele fiierului surs i cel de-al doilea reprezint numele
fiierului destinaie. Funcia returneaz valoarea logic TR5E n caz de succes i valoarea
logic FALSE n caz de eec.
Funcia rename
Aceast funcie se folosete pentru a redenumi un fiier i are doi parametri de tip ir de
caractere. Primul parametru reprezint numele fiierului i cel de-al doilea reprezint noul
numele al acestuia. Funcia returneaz valoarea logic TR5E n caz de succes i valoarea
logic FALSE n caz de eec.
Valori scalare i tablouri
Majoritatea cumprtorilor prefer s cumpere oule n ambalaje de cte 10, nu unul cte
unul. Similar, deseori este convenabil stocarea mai multor valori ntr-o variabil. O asemenea
variabil se numete tablo*, iar valorile individuale se numesc ele$entele tabloului. Variabilele
care au o singur valoare se numesc s%alare. Pentru a fi posibil accesul individual la fiecare
element al unui tablou, fiecare element are o %heie asociat. Combinaia dintre numele
tabloului i valoarea unei chei identific un element al tabloului. Pentru a crea un tablou, se
atribuie unui element al tabloului o valoare i o cheie:
Cod:
<?php
$variabila[1] = "valoarea_a";
?>
Aceast instruciune creeaz un tablou denumit $Cariabila i un element cu valoarea
>Caloarea_a> identificat prin cheia 1. Pentru a stoca n tablou o a doua valoare, putei folosi
urmtoarea instruciune de atribuire:
Cod:
<?php
$variabila[2] = "valoarea_b";
?>
Pentru a obine acces la un element al tabloului, specificai numele tabloului i valoarea cheii:
Cod:
<?php
echo $variabila[1];
?>
Cheile folosite pentru identificarea elementelor unui tablou nu trebuie s fie numere
consecutive; nici macr nu trebuie s fie numere.
Cod:
<?php
$preferinte["vizitator1"] = "scripturi free";
$preferinte["vizitator2"] = "articole";
?>
Elementele unui tablou cu chei non-numerice sunt accesibile n acelai mod ca i elementele
unui tablou cu chei numerice. De exemplu:
Cod:
<?php
$specialitatea_zilei = $preferinta["vizitator1"];
?>
atribuie variabilei $spe%ialitatea_;ilei valoarea >s%ript*ri &ree>.
Crearea tablourilor
Se poate crea un tablou PHP n dou moduri principale. Putei atribui o valoare unei variabile
dintr-un tablou sau putei invoca funcia arra3/0.
Crearea unui tablou folosind atribuiri
Modalitatea cea mai simpl de a crea un tablou este de a atribui o valoare unei variabile de tip
tablou. De exemplu:
Cod:
<?php
$variabila[] = "valoare A";
$variabila[] = "valoare B";
$variabila[] = "valoare C";
?>
Parantezele drepte care urmeaza dup numele variabilei indic limbajului PHP c variabila
$variabila este o variabil de tip tablou. PHP stocheaza n mod automat valorile atribuite
tabloului n celule numerotate succesiv, ncepnd de la $Cariabila[Q. Iat rezultatul tabloului:
Citat:
0 => valoare A
1 => valoare B
2 => valoare C
Simbolul => arat c unei valori i este asociat o cheie. n acest caz, cheia 0 este asociat cu
valoarea "valoare A", cheia 1 este asociat cu valoarea "valoare B", iar cheia 2 este asociat
cu valoarea "valoare C". Putei asocia tabloul cu un tabel, caz n care exemplul anterior arat
astfel:
0 valoare A
1 valoare B
2 valoare C
Dac dorii, putei scrie o instruciune de atribuire care specific o valoare cheie, astfel nct s
putei asocia o valoare cu un anumit element al tabloului. De exemplu:
Cod:
<?php
$variabila[0] = "valoare A";
$variabila[1] = "valoare B";
$variabila[] = "valoare C";
?>
Observai c instruciunea final de atribuire nu include nici o valoare de index. PHP asociaz
valoarea "valoare C" cu urmtorul element consecutiv al tabloului:
Citat:
- => va#oar" .
/ => va#oar" 0
1 => va#oar" 2
Elementele unui tablou nu trebuie asociate unor chei consecutive. Iat un exemplu:
Cod:
<?php
$variabila[10] = "valoare A";
$variabila[15] = "valoare B";
$variabila[] = "valoare C";
?>
Rezultatul va fi:
Citat:
10 => valoare A
15 => valoare B
16 => valoare C
Remarcai c la fel ca n exemplul anterior c valoarea "valoare C" este asociat urmtorului
element consecutiv din tablou. n PHP nu trebuie s folosii numere ntregi pe post de chei.
Putei crea un tablo* aso%iatiC, cunoscut i sub numele de tablo* in,e#at %* sir*ri, prin
specificarea drept chei a unor iruri:
Cod:
<?php
$variabila['a'] = "ceva 1";
$variabila['cc'] = "ceva 2";
$variabila['d'] = "ceva 3";
?>
Prin instruciunile de mai sus, urmtoarele chei au fost atribuite urmtoarelor valori:
Citat:
a => ceva 1
cc => ceva 2
d => ceva 3
Semnificaia utilizrii pe post de chei a unor valori ntregi consecutive este aceea c putei
folosi o bucl &or simpl pentru a parcurge iterativ tabloul, cu alte cuvinte, pentru a examina
valorile fiecruia dintre elementele sale.
Utilizarea funciei array()
Dincolo de utilizarea instruciunilor de atribuire, cealalt modalitate principal de creare a unui
tablou PHP const n utilizarea funciei arra3/0. Iat un exemplu care creeaz un tablou avnd
drept chei valori ntregi consecutive:
Cod:
<?php
$o_variabila = array("ceva", "php", "ceva html");
?>
Acest script creeaza un tablou care conine:
Citat:
0 => ceva
1 => php
2 => ceva html
Dac dorii s asociai unei valori o anumit cheie, putei folosi operatorul =>, astfel:
Cod:
<?php
$o_variabila = array(10=>"ceva", "php", "ceva html");
?>
Care va creea urmtorul tablou:
Citat:
10 => ceva
11 => php
12 => ceva html
Ca i n cazul utilizrii unei instruciuni de atribuire pentru creearea unui tablou, valorile cheilor
nu trebuie s fie consecutive i nici mcar ntregi:
Cod:
<?php
$o_variabila = array("a"=>"ceva", "cc"=>"php", "d"=>"ceva html");
?>
Aceast instruciune creeaz urmtorul tablou:
Citat:
a => ceva
cc => php
d => ceva html
Un tablou multi-dimensional poate fi asimilat, pur i simplu, unui tablou ale crui celule conin
valori ale unui tablou; cu alte cuvinte, un tablou de tablouri. De exemplu un tablou
asemntor:
Pagina Trafic Procent
pagina 1 mic 10
pagina 2 mediu 20
pagina 3 mare 30
Putei reprezenta aceste date sub forma unui tablou PHP denumit $date, prin instruciunile de
mai jos:
Cod:
<?php
$date["pagina 1"] = array("mic", "10");
$date["pagina 2 "] = array("mediu", "20");
$date["pagina 3 "] = array("mare", "30");
?>
Sau putei scrie astfel cu acelai rezultat:
Cod:
<?php
$date = array("pagina 1" => array("mic", "10"), "pagina 2" =>
array("mediu", "20"), "pagina 3" => array("mare", "30"));
?>
Parcurgerea iterativ a unui tablou
Cnd ai stocat date ntr-un tablou, putei obine acces la valoarea unui element al tabloului
sau i putei modifica valoarea prin intermediul cheii asociate elementului. De exemplu, avem:
Cod:
<?php
$a[0] = 1;
$a[1] = 10;
$a[2] = 1000;
?>
Putei obine acces la valoarea asociat cheii 1 prin intermediul unei instruciuni
asemntoare:
Cod:
<?php
$y = 3 * $a[1];
echo $y;
echo $a[1];
?>
Similar, putei modifica valoarea asociat cheii 2 prin intermediul unei instruciuni ca aceasta:
Cod:
<?php
$a[2] = 100;
?>
Uneori, n loc de a obine accesul la un singur element al unui tablou sau de a-l modifica, dorii
s obineti accesul la mai multe elemente ale tabloului. De exemplu, s presupunem c dorii
s determinai dac n tablou exist o anumit cheie sau valoare. S presupunem c tabloul
reprezint salarii i dorii s mrii fiecare valoare cu 10 procente. Operaii de acest gen
implic parcurgerea iterativ a tabloului sau, altfel spus, accesul la fiecare element al
tabloului. n continuare o s ncerc o scurt prezentare a modului de iteraie prin tablouri
secveniale i non-secveniale.
Parcurgerea iterativ a unui tablou secvenial
Un tablou al crui chei sunt valori ntregi consecutive se numete tablou secvenial. n general,
valoarea cea mai mic a unei chei dintr-un tablou secvenial este zero; totui, putei crea un
tablou secvenial folosind valoarea unu sau orice alt valoare ntreag ca valoare minim a
cheii. n cazul n care cunoastei valoarea minim a cheii unui tablou secvenial, putei
parcurge iterativ tabloul folosind o bucl &or. Pentru aceasta, iniializai variabila de bucl la
valoarea cea mai redus a cheii. Folosii funcia %o*nt/0 pentru a forma expresia de test a
buclei. Funcia %o*nt/0 returneaz numrul elementelor dintr-un tablou. Iat un exemplu:
Cod:
<?php
$test = array(0=>"valoare a", 1=>"valoare b", 2=>"valoare 3");
$maxim = count($test);
for ($w=0;$w<$maxim;$w++)
{
echo "<br>$w => $test[$w]";
}
?>
Prima instruciune creeaz tabloul. Cea de-a doua instruciune obine numrul elementelor din
tablou. Instruciunea &or folosete variabila bucl $9 pentru a parcurge iterativ tabloul; corpul
instruciunii include o instruciune e%ho care afieaz cheia i valoarea fiecrui element din
tablou. Datele de ieire arat astfel:
Citat:
0 => valoarea 1
1 => valoarea 2
2 => valoarea 3
Cutarea ntr-un tablou secvenial
Exemplu:
Cod:
<?php
$test = array(0=>"valoare a", 1=>"valoare b", 2=>"valoare 3");
$cautare = "valoare b";
// se cauta in tabloul $test valoarea $cautare
$maxim = count($test);
echo "<br>Se cauta cuvantul $cautare in tabloul test.";
for ($w=0; $w < $maxim; $w++)
{
echo "<br>Se compara cuvantul cu $test[$w]";
if ($cautare == $test[$w])
{
echo "<br>A fost gasit cuvantul $cautare in tabel la nr. $w";
}
}
?>
Prima instruciune creeaz tabloul n care se va cuta. Desigur, ntr-o aplicaie iterativ real,
tabloul nu va fi iniializat cu valori literale imediat anterior operatiei de cutare. ntr-o aplicaie
real, coninutul tabloului este supus la variaii. Cea de-a doua instruciune atribuie valoarea
"valoare b" variabilei $%a*tareE n exemplu, se caut n tablou valoarea stocat n variabila
$%a*tare. Dup comentariu, urmtoarea instruciune obine numrul elementelor din tablou i
stocheaz aceast valoare n variabila $$a#i$. Instruciunea &or funcioneaza ca mai nainte;
de data aceasta ns, corpul ei conine alte instruciuni i se execut o alt operaie. O
instruciune e%ho afieaz valoarea fiecrui element al tabloului pe masur ce bucla for
avanseaz. Instruciunea if testeaz fiecare element i afieaz un mesaj dac valoarea
elementului este una i aceeai cu valoarea variabilei $%a*tare. Iat rezultatul acestui
exemplu:
Citat:
Se cauta cuvantul valoare b in tabelul test
Se compara cuvantul cu valoare a
Se compara cuvantul cu valoare b
A fost gasit cuvantul valoare b in tabel la nr. 1
Se compara cuvantul cu valoare 3
Instruciunea break
Observai n exemplul dat mai sus c se continu cutarea chiar i dup stabilirea unei
identiti. Cnd se caut ntr-un tablou, execuia cutrii poate fi sistat dup gsirea
elementului dorit; continuarea cutrii n tablou nu face dect s iroseasc resursele
calculatorului, fr a afecta rezultatele operaiei. Pentru a oprii execuia putei folosi
instructiunea brea), care determin ncheierea imediat a buclei care o conine. Iat cum ar
arta exemplul anterior cu o instruciune brea):
Cod:
<?php
for ($w=0; $w < $maxim; $w++)
{
echo "<br>Se compara cuvantul cu $test[$w]";
if ($cautare == $test[$w])
{
echo "<br>A fost gasit cuvantul $cautare in tabel la nr. $w";
break;
}
}
?>
Acum, dup stabilirea unei identiti, instruciunea brea) provoac sistarea buclei &or. Datele
de ieire vor arta astfel:
Citat:
Se cauta cuvantul valoare b in tabelul test
Se compara cuvantul cu valoare a
Se compara cuvantul cu valoare b
A fost gasit cuvantul valoare b in tabel la nr. 1
Instruciunea continue
O instruciune corelat cu instruciunea brea) este %ontin*e. Instruciunea continue sisteaz
rularea curent a buclei, determinnd evaluarea imediat a expresiilor de incrementare i de
test. Ca un exemplu, s presupunem c dorii s cautai n tabloul $test pentru a determina
numrul valorilor cu nume scurte, adic nume alcatuite din maxim 4 caractere. Iat un
exemplu:
Cod:
<?php
$test = array(0=>"a", 1=>"bbb", 2=>"ccccc");
// numara numele scurte
$scurt = 0;
$limita = count($test);
for ($w = 0; $w < $limita; $w++)
{
$n = strlen($test[$w]);
echo "<br>$test[$w] are $n caractere lungime.";
if ($n > 4) continue;
$scurt++;
}
echo "<br> Au fost gasite $scurt cuvinte cu nume scurte.";
?>
O instruciune de atribuire stabileste valoarea iniial a variabilei $s%*rt, folosit pentru a
numra numele scurte gsite, la zero. Instruciunea &or se aseamn celor folosite anterior.
Corpul acestei instruciuni difer, desigur, de cele folosite anterior. Valoarea variabilei $n este
stabilit ca fiind egal cu numrul caracterelor care compun cuvntul, folosind funcia strlen/0,
care calculeaz lungimea unui sir. Dac instruciunea i& stabilete c elementul curent al
tabloului face referire la un cuvnt lung, se execut instruciunea %ontin*e. Instruciunea
%ontin*e determin trecerea cutrii la urmtorul element din tablou; dac nu au mai rmas
elemente n tablou, bucla &or i ncheie execuia. La finalizarea cutrii, o instruciune e%ho
afieaz numrul cuvintelor scurte gsite n tablou. Iat rezultatul:
Citat:
a are 1 caractere lungime
bbb are 3 caractere lungime
ccccc are 5 caractere lungime
Au fost gasite 2 cuvinte cu nume scurte.
Parcurgerea iterativ a unui tablou non-secvenial
n unele limbaje de programare, parcurgerea unui tablou non-secvenial este o operaie
complicat. Cu toate acestea, PHP 4 include o instruciune &orea%h care simplific cutrile de
acest gen. Instruciunea &orea%h are urmtoarea form general:
Cod:
<?php
foreach ($tablou as $cheie => $valoare) {corp}
?>
Instruciunea parcurge n mod iterativ tabloul denumit $tablo*, stabilind valori adecvate
pentru valorile variabilelor $%heie i $Caloare aferente fiecrui element al tabloului. Iat un
exemplu:
Cod:
<?php
$test = array(10=>"mere", 20=>"metal", 21=>"Nume");
foreach ($test as $index => $continut)
{
echo "<br>$index => $continut";
}
?>
Pentru a cuta ntr-un tablou multi-dimensional, se folosesc instruciuni foreach mbricate. S
lum de exemplu tabloul urmtor:
Pagina Trafic Procent
pagina 1 mic 10
pagina 2 mediu 20
pagina 3 mare 30
Tabloul poate fi creat folosind urmtoarele instruciuni PHP:
Cod:
<?php
$date["pagina 1"] = array("mic", "10");
$date["pagina 2 "] = array("mediu", "20");
$date["pagina 3 "] = array("mare", "30");
?>
Comanda care afieaz coninutul tabloului este:
Cod:
<?php
foreach ($date as $continut => $valoare)
{
foreach ($valoare as $cheie => $rezultat)
{
echo "<br>$continut: $rezultat";
}
}
?>
Instruciunea &orea%h exterioar obine tabloul asociat cu fiecare pagin (pagina 1, 2 etc...);
instruciunea foreach interioar parcurge iterativ coninutul. Iat rezultatul:
Citat:
pagina 1 mic
pagina 1 1!
pagina 2 mediu
pagina 2 2!
pagina 3 mare
pagina 3 3!
Lucrul cu formulare
Utilizarea scripturilor php n formulare
Odat am avut nevoie ntr-un formular s fie afiat iniial data din ziua completrii
formularului. M gndesc c uneori o s avei i voi nevoie de anumite date (de exemplu la o
comand ntr-un formular s apar ntr-un cmp doar ceea ce exist n acel moment pe stoc,
care stoc se gsete n baza de date mysql de pe server). Iat ce trebuie s facei:
Cod:
<form name="form1" method="post" action="pagina_de_test.php">
Data curenta:
<input name="data" type="text" id="data"
value="
<?php
$data=date("d-h-Y",time()); echo $data;
?>
">
<br>
<br>
<input type="submit" name="Submit" value="Trimite">
</form>
Dup cum observai, la valoarea cmpului "data" am introdus un mic script php care citete
data curent de pe server i o timite browserului, acesta o afieaz n cmpul de text
corespunztor. Putei ncerca i voi s citii anumite date dintr-un fiier txt sau din baza de
date i s le afiai n formular.
Dac dorii s apar un mesaj n interiorul cmpului dar s dispar cnd un utilizator vrea s
introduc propriul lui text, codul ar fi cam aa:
Cod:
<form>
<INPUT name=test id="test"
onclick="this.value='';" value=cauta size=15 maxLength=30>
<INPUT name="submit" type=submit id="submit" value=GO>
</form>
Dac cineva ncearc s scrie ceva, textul "caut" va dispare i va fi nlocuit cu mesajul
introdus de utilizator.
Preluarea i verificarea datelor dintr-un formular n aceeai pagin cu formularul
De curnd cineva mi-a cerut s fac un formular cu un grup de butoane radio care s trimit
datele pe e-mail. Simplu spun eu i m apuc de treab. Problema pe care ns am ntmpinat-
o a fost c un grup de butoane radio trimite doar o valoare, indiferent ce buton e selectat. Mai
jos avei codul de la script cu una din rezolvri (eu am gasit 3 variante de rezolvare a acestui
script, dar probabil sunt mult mai multe)
Cod:
<?php
if (isset($_POST['Submit']))
// deoarece verificarea se face in aceeasi pagina cu formul
// se verifica inainte daca a fost apasat butonul submit
{
// preluare variablile (daca sunt trimise)
@$vot = $_POST['vot'];
// verificare
if ($vot == "") // aici se verifica daca a fost selectat ceva
{
echo "<br>Nu ai votat. Incearca din nou.";
}
if ($vot == "vot_1") // daca e selectat vot 1 afiseaza si eventual
trimite pe e-mail...
{
echo "<br>Ai votat numarul 1.";
}
if ($vot == "vot_2") // daca e selectat vot 2 afiseaza si eventual
trimite pe e-mail...
{
echo "<br>Ai votat numarul 2.";
}
if ($vot == "vot_3") // daca e selectat vot 3 afiseaza si eventual
trimite pe e-mail...
{
echo "<br>Ai votat numarul 3.";
}
// afisare continutul variabilei vot
echo "<br>Continutul casutei de vot este: ".$vot;
}
?>
<html>
<head>
<title>Formular de vot</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-
1">
</head>
<body>
<!-- aici incepe formul de votare -->
<form name="formular_vot" method="post" action="test_vot.php">
<p>
<label>
<input type="radio" name="vot" value="vot_1">
vot a</label>
<br>
<label>
<input type="radio" name="vot" value="vot_2">
vot b</label>
<br>
<label>
<input type="radio" name="vot" value="vot_3">
vot c</label>
<br>
<input type="submit" name="Submit" value="Voteaza">
<br>
</p>
</form>
<!-- aici se incheie formularul de vot -->
</body>
</html>
Dup cum observai, scriptul este mprit n 2 pri. Prima parte este codul php care verific
dac a fost apsat butonul "S*b$it" i dac a fost apsat se preia valoarea butonului radio i
se verific. Dac nu a fost apsat butonul "S*b$it" se sare peste codul php i se trece direct
la partea html unde se afieaz butoanele radio.
Lucrnd recent cu cteva formulare am ntmpinat unele dificulti pe care vreau s le descriu
mai jos pentru a avea un punct de plecare n cazul n care mai am astfel de probleme. Pentru
nceput o s explic cum se trimit i cum se preiau datele din formular n aceeai pagin. Avem
urmtorul formular:
Cod:
<?php
// aici se verifica daca a fost trimis un camp din formular
if (isset($_POST['camp1'])) // daca a fost trimis
{
// se preiau datele trimise
$camp1 = $_POST['camp1'];
// se verifica daca a fost scris ceva
if (empty($camp1))
{
echo "<br>Nu a fost introdus nimic";
}
else
{
echo "<br>A fost introdus: ".$camp1;
}
}
if (!isset($_POST['camp1'])) // daca nu a fost trimis
{
// se initializeaza variabilele
$camp1 = '';
}
?>
<form name="form1" method="post" action="
<?php $_SERVER['PHP_SELF'] ?>
">
<div align="center">
<input name="camp1" type="text" id="camp1" value="
<?php echo $camp1; ?>
">
textfield<br>
<input type="submit" name="Submit" value="Trimite">
</div>
</form>
S explic puin codul de mai sus.
Prima oar cnd se acceseaz pagina este logic c nu se trimite nici o valoare din formular.
Dac nu ar fi fcut verificarea de setare a unei valori din formular (rndul
if(isset($_POST['camp1']) ) i s-ar fi ncercat preluarea direct a valorii (rndul $camp1 =
$_POST['camp1']; ) ar fi dat o eroare (dac avei configurat serverul s v arate toate erorile)
n schimb, aa ai evitat o eventual eroare i scriptul ruleaz corect indiferent de setrile
serverului... Observai c la preluarea variabilei trimise prin post se folosete un mic truc i
anume numele variabilei este acelai cu numele cmpului trimis prin POST. n cazul cnd
serverul are setat register_global = off este mai sigur s folosii astfel preluarea variabilelor
pentru a nu v da eroare. Putei lucra i direct cu valoarea POST dar personal prefer s scriu
mai puin folosind de fiecare dat numele variabilei ( $camp1 ) nu tot irul dat de valoarea
POST ( $_POST['camp1'] ) E mai puin de scris iar dac folosesc variabila n alte locuri evit
erorile generate de lipsa unei ghilimele
(de genul echo 'ceva aici $_POST['camp1']; // aceasta comanda nu va merge pentru ca am
uitat sa inchid ghilimelele pe cand asa echo '$camp1'; va merge intotdeauna).
n continuare urmtorul rnd verific dac valoarea preluata din formular conine ceva sau nu.
Dac exist ceva atunci afieaza mesajul mpreun cu ceea ce a fost introdus. Mai departe, n
caz c se ncarc pagina prima data i formularul nc nu a fost trimis se iniializeaz valoarea
variabilei pentru cmpul respectiv. n cazul n care nu se iniializeaz valoarea i se ncearc
afisarea ei direct va aprea un mesaj de eroare (dac serverul e setat s afieze mesajele de
eroare).
Acum, dac suntei lmurii ce se ntmpl acolo s trecem mai departe (iar dac nu, atunci
recitii articolul i vedei nc odat sursa pn nelegei :-P )
Afiarea unui text ntr-un cmp n form care dispare n cazul n care se introduce
ceva n acel cmp
De multe ori, am un formular n care vreau s scriu ceva ntr-un anumit cmp iar dac
vizitatorul doreste s completeze acel cmp s nu stea s tearg mesajul meu ci s dispar
automat textul introdus de mine i s rmn doar ce a introdus vizitatorul. Aa ceva se poate
face simplu cu o scurt funcie javascript:
Sursa: Exemplu:
<form name="form2" method="post" action="pagina.php">
<input name="textfield" type="text"
value="acest text dispare" onmousedown=" this.value='' ">
</form>
Preluarea datelor dintr-un cmp cu select multiplu
n cazul n care n formular trebuie s existe i un textfield din care se pot selecta simultan
mai multe cmpuri, preluarea datelor poate prea mai complicat, dar n realitate este la fel
de simplu ca i pn acum, i anume:
Cod:
<?php
if (isset($_POST['select']))
{
foreach ($_POST['select'] as $cheie => $valoare)
{
echo "<br>A fost selectata valoarea ".$valoare;
}
}
?>
<form name="form3" method="post" action="
<?php $_SERVER['PHP_SELF'] ?>
">
<div align="center">
<select name="select[]" size="5" multiple>
<option value="1">valoarea 1</option>
<option value="2">valoarea 2</option>
<option value="3">valoarea 3</option>
<option value="4">valoarea 4</option>
<option value="5">valoarea 5</option>
</select>
Selectati mai multe valori<br>
<br>
<input type="submit" name="Submit2" value="Submit">
</div>
</form>
Momentan m opresc aici cu prezentarea trucurilor n lucrul cu formulare, dac mai avei
ntrebri discutm n forum.
Conversia tipurilor de variabile
PHP este ceea ce se numeste un limbaj de programare cu tipuri dinamice. O consecin a
caracterului dinamic al tipurilor de variabile aferente limbajului PHP este aceea c nu trebuie
s specificai tipul variabilelor. PHP determin tipul variabilei n funcie de tipul ultimei valori
atribuite variabilei. Cu toate acestea, caracterul dinamic al tipurilor nu v scutete de
problemele legate de tipuri. n continuare este o descriere a tipurilor acceptate i ceea ce se
ntmpl cnd n cadrul expresiilor se folosesc dou sau mai multe tipuri.
Conversia automat de tip
S lum ca exemplu urmtorul script:
$# = <E
$3 = =.JE
$; = $# @ $3E
e%ho $;E
Cnd o expresie aritmetic folosete mai multe tipuri, PHP execut conversia automat de tip.
Dac oricare dintre operanzi este de tip dublu, PHP trateaz ceilalti operanzi ca i cum ar fi de
tip dublu, execut calculele i returneaz rezultatul ca valoare de tip dublu. Dac toti operanzii
unei expresii sunt ntregi, PHP execut calculul i returneaz rezultatul sub forma de ntreg. n
exemplul de mai sus, rezultatul va fi 3.5 o valoare de tip dublu. Este important de reinut c
prin conversia de tip nu se modific tipurile operanzilor unei expresii; acetia sunt pur i
simplu tratai ca i cum ar fi fost de alt tip. n cadrul exemplului, variabila $x rmne de tip
ntreg, chiar dac PHP o trateaz ca o valoare de tip dublu pentru a executa calculele.
irurile pot fi de asemenea supuse unei conversii de tip. S examinm urmtorul exemplu:
$# = <E
$3 = $# @ >< $ore>E
e%ho $3E
Valoarea afiata este 2, adic suma dintre valoarea variabilei $x i valoarea numeric a irului
text, care este 1. Valoarea numeric i tipurile unui ir sunt determinate prin respectarea
urmtoarelor reguli:
1. Dac irul ncepe cu o valoare numeric, valoarea irului este dat de valoarea numeric
respectiv; n caz contrar, valoarea irului este zero.
2. Dac un punct zecimal sau un exponent (e sau E), este asociat cu valoarea numeric, tipul
variabilei rezultate este dublu; n caz contrar, tipul valorii rezultante este un ntreg.
Conversia manual de tip
Dac preferai, putei prelua controlul conversiei de tip sau putei modifica tipul unei variabile.
Pentru a prelua controlul conversiei de tip, putei %onCerti &or8at un operand de la un tip la
altul, proces cunoscut sub numele de %onCersie &or8atU ,e tip sau pur i simplu %onCersie
&or8atU. n continuare avei un exemplu de conversie de tip:
$# = <E
$3 = =.JE
$; = $# @ /integer0 $3E
e%ho $;E
Conversia forat de tip, i anume (integer), determin tratarea variabilei $y ca pe un ntreg,
iar valoarea acesteia devine 2, n loc de 2.5, care este valoarea real a variabilei $z. Tabelul
urmtor indic i alte conversii forate de tip care se pot folosi:
Conversia forat Rezultat
(int), (integer) Conversie forat la ntreg
(real), (double), (float) Conversie forat la dublu
(string) Conversie forat la ir
(array) Conversie forat la tablou
(object) Conversie forat la obiect
Numeroase funcii furnizeaz nca o modalitate de a trata o variabil ca i cum ar fi de tip
specificat. Tabelul urmtor prezint succint aceste funcii.
Funcie Operaie
doubleval() Trateaz argumentul ca fiind de tip dublu
intval() Trateaz argumentul ca fiind de tip ntreg
strval() Trateaz argumentul ca fiind de tip ir.
Exemplu:
$# = <.JE
$3 = intCal/$#0E
e%ho $#E
e%ho $3E
Valoarea 1.5 este afiat ca valoare a variabilei $x, iar valoarea 1 este afiat ca valoare a
variabilei $y.
Nici conversia normal i nici cea forat nu modific tipul unui operand. Ambele mecanisme
determin tratarea operanzilor ca i cum ar fi de un alt tip. Totui, modificarea tipului unei
variabile este posibil prin utilizarea funciei sett3pe/0. Acest procedeu este ilustrat n
continuare:
$# = <.JE
sett3pe/$#. >integer>0E
e%ho $#E
Valoarea afiata a variabilei $x este egal cu unitatea, deoarece fracia zecimal se pierde
atunci cnd funcia sett3pe/0 convertete valoarea dubl la o valoare ntreag. Putei obine
acelai rezultat cu urmtoarea instruciune de atribuire, care folosete o conversie forat:
$# = /integer0 $#E
Valorile posibile pentru al doilea argument al funciei sett3pe/0, i anume argumentul care
specific tipul dorit, sunt:
- integer
- double
- string
- array
- object
O funcie conex, i anume gett3pe/0, returneaz un ir care indic tipul variabilei specificate.
Scriptul urmtor afieaza irul >integer>, care indic tipul variabilei $x:
$# = <E
e%ho gett3pe/$#0E
Instruciuni de atribuire
n cazul n care dorii o modalitate rapid de a scrie o instruciune de atribuire, putei folosi
anumii operatori. Urmtoarele dou instruciuni de atribuire, una normal i una "rapid", au
acelai efect:
$# @= <E
$# = $# @ <E
Aceast instruciune de atribuire "rapid" v scutete de efortul de a scrie o variabil, $x n
cazul exemplului nostru, n ambii membri ai instruciunii de atribuire. Tabelul urmtor rezum
operatorii "rapizi" de atribuire pentru operaiile aritmetice i pentru iruri, furniznd un
exemplu pentru fiecare operator i o instruciune de atribuire echivalent.
Instruciune de atribuire "rapid" Instruciune de atribuire normal
x += y x = x + y
x -= y x = x - y
x /= y x = x / y
x *= y x = x * y
x %= y x = x % y
x .= y x = x . y
Scrierea instruciunilor swich, break i default
Instruciunea i& v permite s luai o decizie n dou sensuri. Pentru a putea lua o decizie n
mai multe sensuri, putei folosi mai multe instruciuni i&, else sau elsei&. Cu toate astea, cnd
dorii ca programul dvs. s aleag dintr-un set de alternative care pot fi reprezentate prin
valori ntregi, instruciunea s9it%h este o opiune mai convenabil. De exemplu, s
presupunem c valoarea variabilei $n*$ar este 1, 2 sau 3, reprezentnd respectiv
dimensiunile mic, medie i mare. Iat un mic program care afieaz dimensiunile asociate
valorilor variabilei $n*$ar:
Cod:
<?php
switch ($numar)
{
case(1):
echo "numar mic";
break;
case(2):
echo "numar mediu";
break;
case(3):
echo "numar mare";
break;
default:
echo "Acesta nu este un numar valabil";
}
?>
Aciunea unei instruciuni s9it%h este determinat de valoarea unei expresii ntregi, nu de
valoarea unei expresii condiionale. Numele variabilei este dat ntre parantezele care urmeaz
dup cuvntul cheie s9it%h. Parantezele acolade delimiteaz o serie de instruciuni %ase i o
instruciune ,e&a*lt opional, fiecare dintre instruciunile cuprinse ntre paranteze putnd
avea instruciuni asociate.
Cnd este executat, instruciunea s9it%h ncearc s stabileasc o identitate ntre valoarea
variabilei sale asociate i valoarea asociat unei instruciuni %ase. Se vor executa instruciunile
asociate primei instruciuni %ase pentru care identitatea respectiv este valabil. Dac
valoarea variabilei din instruciunea s9it%h nu corespunde nici uneia dintre valorile asociate
instructiunilor %ase, se vor executa instruciunile asociate instruciunii ,e&a*lt, dac exist o
asemenea instruciunie.
Un procedeu de programare indicat const n aceea c fiecare instruciune %ase din cadrul unei
instruciuni s9it%h s se ncheie cu o instruciune brea). Instruciunea brea) determin
ncheierea exeuiei instruciunii s9it%h, transfernd controlul urmtoarei instruciuni
secveniale care succede instruciunii s9it%h.(adic se continu cu restul codului din script) n
absena instruciunii brea), execuia trece la urmtoarea instruciune %ase sau ,e&a*lt, fapt
nedorit n majoritatea cazurilor. Nu este necesar s folosii numere ntregi consecutive n
instruciunile %ase. Se pot folosi numere ntregi non-consecutive, numere cu virgul mobil
sau iruri.
n exemplul urmtor avei o instruciune s9it%h care testeaz valoarea variabilei $$eni*.
Instruciunea atribuie variabilei $s*b$eni* o valoare dup cum urmeaz:
dac $$eni* este 1, $s*b$eni* primeste valoarea 5;
dac $$eni* este 2, $s*b$eni* primeste valoarea 10;
altfel, $s*b$eni* primete valoarea 0.
Cod:
<?php
switch ($meniu)
{
case 1:
$submeniu = 5;
break;
case 2:
$submeniu = 10;
break;
default:
$submeniu = 0;
}
?>
PHP include numeroase instruciuni condiionale, incluznd instruciunile i&, else, elsei& i
s9it%h. Mai exist ns i alt mecanism de luare a deciziilor - operatorul condiional A!, denumit
uneori i operator ternar sau operator ntrebare-dou puncte. El constituie o alt modalitate de
a scrie decizii n PHP. Operatorul condiional formeaz o expresie care se poate folosi n multe
contexte PHP.
Iat sintaxa de utilizare a acestuia:
e#presieR%on,itionala A CaloareRa,eCarat ! CaloareR&als
Se observ cum semnul ntrebrii este separat de caracterul dou puncte prin valoarea
CaloareRa,eCarat. Operatorul condiional i evalueaz expresia condiionala. Dac expresia
este evaluat la valoarea tr*e (adevrat), operatorul condiional returneaz valoarea CaloareR
a,eCarat; n caz contrar, returneaz valoarea CaloareR&als. Operatorul condiional v permite
s specificai deciziile ntr-o manier foarte concis. De exemplu, s lum urmtoarea
instruciune de atribuire:
$a = /$b N $%0 A < ! =
Aceast instruciune de atribuire compar valorile variabilelor $b i $%. Dac valoarea
variabilei $b este mai mare dect aceea a variabilei $%, atunci variabilei $a i este atribuit
valoarea 1; n caz contrar, variabilei respective i este atribuit valoarea 2.
Scrierea instruciunilor for
Revin n acest articol la detalierea instruciunii &or, pe care o folosesc destul de des n ultima
vreme. Instruciunea &or este o instruciune bucl sau o instruciune iterativ; cu alte cuvinte,
o instruciune care execut n mod repetat instruciunile asociate. Iat un exemplu de utilizare
a unei instruciuni &or:
Cod:
<?php
$suma = 0;
for ($n = 1; $n <= 3; $n++)
$suma += $n;
echo "<br>Suma intregilor de la 1 la $numar este $suma.";
?>
n exemplul de mai sus se calculeaz suma ntregilor cuprini ntre 1 i 3. Pentru aceasta, mai
nti se iniializeaz variabila $s*$a la valoarea 0. Apoi, se execut o instruciune &or care
incrementeaz n mod repetat valoarea variabilei $s*$a.
Pentru a vedea cum funcioneaz mecanismul aestei instruciuni, s examinm componentele
instruciunilor &or. Instruciunea &or include trei expresii, care apar ntre paranteze; fiecare
expresie este separat de vecina sa printr-un caracter punct i virgul. De asemenea,
instruciunea &or include o instruciune sau un grup de instruciuni, cunoscute sub numele de
%orp*l instruciunii &or. n exemplul de mai sus, instruciunea $s*$a @= $n este corpul
instruciunii &or.
S examinm mai amnunit cele trei expresii:
- Prima expresie este expresia de ini8iali;are. Aceasta se execut atunci cnd PHP ajunge la
instruciunea for. n exemplu, expresia de iniializare atribuie valoarea 1 variabilei $n, variabil
denumit Cariabila ,e %i%lare sau in,e#.
- A doua expresie este e#presia ,e test. Aceasta este o expresie condiional care indic dac
se execut sau nu corpul instruciunii. n general, face referire la variabila de ciclare. n cadrul
exemplului, expresia de test compar valoarea variabilei $n cu valoarea 3. Expresia de test
este evaluat pentru prima data imediat dup evaluarea expresiei de iniializare.
- Cea de-a treia expresie este e#presia pas. n general, aceasta modific una sau mai multe
variabile la care se face referire n expresia test. n cadrul exemplului, expresia pas
incrementeaza valoarea variabilei $n.
Secvena de execuie a unei instruciuni &or este urmtoarea:
1. Se evaleaz expresia de iniializare.
2. Se evalueaz expresia test.
3. Dac rezultatul evalurii expresiei test este &alse, se execut etapa 7.
4. Se execut corpul buclei.
5. Se evalueaz expresia pas.
6. Se trece la etapa 2.
7. Se ncheie execuia instruciunii &or, prin executarea urmtoarei instruciuni secveniale.
Instruciunea &or este util pentru numrare i executarea n mod repetat a unor aciuni. n
acest site de exemplu am folosit instructiunea &or pentru a trimite ctre fiecare user nscris la
newsletter cte un e-mail de fiecare dat cnd este actualizat acest site.
Scrierea instruciunilor while i do while
Practic, instruciunile 9hile i ,o 9hile reprezint versiuni "manuale" ale instruciunii &or. Dac
o instruciune &or are trei expresii, o instruciune 9hile sau ,o 9hile are una singur, i anume
expresia de test. Aa cum se ntmpl de obicei, expresiile unei instruciuni &or sunt opionale;
fr o expresie de iniializare sau o expresie pas, o instruciune &or opereaz n acelai mod ca
o instruciune 9hile. n consecin, urmtoarele dou instruciuni sunt echivalente:
Cod:
<?php
for ( ; $i <= 3; ) $suma += $i;
while ($i <= 3) $suma += $i;
?>
Cnd folosii o instruciune 9hile, trebuie s furnizai un mecanism oarecare, analog expresiei
de incrementare a instruciunii &or, care actualizeaz variabilele la care se face referire n
expresia de test. De asemenea, suntei responsabil cu iniializarea tuturor valorilor folosite n
expresia de test.
Secvena de execuie a unei instruciuni 9hile este urmtoarea:
1. Se evalueaz expresia test.
2. Dac rezultatul este &alse, se trece la etapa 5.
3. Se execut corpul buclei.
4. Se trece la etapa 1.
5. Se prsete bucla, prin executarea urmtoarei instruciuni secveniale.
Iat un exemplu care utilizeaz instruciunea 9hile:
Cod:
<?php
$n = 0;
$suma = 0;
while ($n <= 3)
{
$suma = $suma + $n;
$n++;
}
echo "Suma este $suma.";
?>
Remarcai c instruciunea $n = QE iniializeaz bucla i c instruciunea $n@@E incrementeaz
valoarea variabilei bucla $n. Instruciunea 9hile este cea mai util atunci cnd un alt program
necesar execut deja aceste funcii; n asemenea situaii, instruciunea 9hile este mai clar
dect o instruciune &or degenerat, creia i lipsesc una sau mai multe dintre expresiile sale
obinuite.
Instruciunea ,o 9hile este oarecum asemntoare instruciunii 9hile. Diferena este aceea c
instruciunea ,o 9hile i execut corpul nainte de a-i evalua expresia de test. Astfel, corpul
buclei unei instruciuni ,o 9hile este ntotdeauna executat cel puin o dat; corpul unei
instruciuni 9hile este omis dac expresia de test are iniial valoarea &alse.
Secvena de execuie a unei instruciuni ,o 9hile este urmtoarea:
1. Se execut corpul buclei.
2. Se evalueaz expresia de test.
3. Dac rezultatul este adevrat, se trece la etapa 1.
4. Se ncheie execuia buclei, prin executarea urmtoarei instruciuni secveniale.
Iat un exemplu care folosete o instruciune ,o 9hile. Observai c amplasarea expresei de
test imediat dup corpul buclei v reamintete faptul c executarea corpului are loc nainte de
evaluarea expresiei de test:
Cod:
<?php
$suma = 0;
$n = 1;
do
{
$suma += $n;
$n++;
}
while ($n <= $numar);
echo "<br>Suma intregilor cuprinsi intre 1 si $numar este $suma.";
?>
Instruciunile 9hile i ,o 9hile sunt foarte asemntoare. Utilizarea instruciunii ,o 9hile este
o chestiune de comoditate, nu de necesitate. Se pot scrie aplicaii php folosind doar
instruciuni 9hile.
Introducere n Clase PHP
Cnd ncepi s lucrezi cu PHP, i dai seama c sunt multe locuri n care trebuie s scrii aceai
bucat de cod. Unii dintre voi probabil s-au prins c aceasta se poate rezolva cu o funcie, asta
economisind ceva timp atunci cnd vei vrea s refolosii codul. Pur i simplu declarai o
funcie i i spunei acelei funcii ce informaie vrei s foloseasc. Metoda este similar celei
de mai jos:
Cod:
<?php
function Functia_Mea($variabila)
{
// Foloseste $variabila aici:
echo $variabila;
}
?>
i apoi doar apelezi funcia atunci cnd ai nevoie de ea:
Cod:
<?php
Functia_Mea("Salut, bine ai venit pe site");
?>
i funcia va afia la ieire >Sal*t. bine ai Cenit pe site>
Ei bine, dup un timp se vor aduna prea multe funcii i te vei aglomera. Folosind Clase PHP,
poi ncepe s pui acele funcii n nite "cutii" unde sunt stocate i folosite. Clasele PHP s-au
dovedit a fi foarte valoroase, atunci cnd sunt gndite i cnd e scris codul bine. V voi face o
introducere n Clase i v voi da cteva exemple unde pot fi folosite. Sper ca la sfritul
acestui tutorial te vei gndi s implementezi nite clase proprii economisind astfel timp n
viitoarele proiecte.
Dar haideti s lsm vorbria i s ncepem s ne stocm funciile n interiorul Claselor.
Structura Clasei
Cnd v gndii la clase v-a ncuraja s v gndii ca la "codul din spate". Codul va fi stocat n
spatele site-ului, iar n fa va fi un bloc de cod foarte uor de neles. Voi pune toate rutinele
complicate n clasa ta, iar scriptul care folosete acea clas va fi mai uor de neles pentru c
va avea un cod "curat". Acesta nu este singurul motiv pentru care poi folosi clasele, dar este
motivul pentru care eu le folosesc.
OK, s aruncm o privire pe clas:
Cod:
<?php
class Clasa_mea
{
var $email;
// folosim o functie fara variabile
function verifica_email()
{
if (ereg("^.+@.+\..+$", $this -> email))
return(true);
else
return(false);
}
// Folosim o functie cu variabile
function scoate_imag($cevahtml)
{
$cevahtml = preg_replace("/(<img)(.*?)(>)/si", "", $cevahtml);
return $cevahtml;
}
}
?>
Clasa de mai sus a fost compus din 2 funcii simple. Vom analiza funciile pentru a nelege
despre ce este vorba aici.
Mai nti trebuie s declarm o clas:
%lass :lasa_$ea H
Vom crea nite variabile ce pot fi folosite n oricare din funciile din interiorul clasei fr s
trebuiasc s fie specificate pentru fiecare funcie. Vom face asta prin >Car $n*$e_Car>, priviti
mai jos pentru exemplul $e$ail pe care l vom folosi.
Car $e$ailE
n continuare, s analizm prima funcie. Funcia aceasta valideaz mail-ul introdus de
utilizator. Caut text n ambele pri ale simbolului "@" care este structura unei adrese de
email. Aceast funcie va prelua variabila $email definit n scriptul nostru care apeleaz clasa
i verific validitatea email-ului. Dac adresa de email trece de aceast verificare i este o
adres valid, vom returna "TRUE", altfel vom returna "FALSE". Voi explica asta puin mai
trziu.
Cod:
<?php
// folosim o functie fara variabile
function verifica_email()
{
if (ereg("^.+@.+\..+ $ " , $this -> email))
return ( true );
else
return ( false );
}
?>
Uitndu-v la funcia de mai sus, ai remarcat c am folosit > $thisRNe$ail > unde $thisRN e un
constructor special care indic n interiorul clasei ctre o variabil sau o alt funcie. La nceput
am definit var $e$ail, acum avem $thisRNe$ail . Vei vedea cum s atribuii o valoare lui
$thisRNe$ail cnd vom folosi "efectiv" scriptul ce apeleaz clasa .
Nota: putei de asemenea folosi n interiorul unei funcii dintr-o clas, o alt funcie ce se afl
n aceeai clas. Doar introducei $thisRNn*$ele_&*n%tiei/$Cars0E i funcii din interiorul
aceleiai clase se pot folosi reciproc.
Pentru a v da un exemplu c putei pune aproape orice dorii n interiorul unei clase, am fcut
aceast clas "cu scop general" ce poate fi utilizat n mai multe scopuri. Mai jos vei vedea o
funcie pe care am introdus-o n aceast clas, funcie care elimin tag-urile unei imagini
dintr-un string (ir de caractere). Am vrut s v art aceast clas i pentru c este o metod
diferit de a apela funcia, aceast funcie va accepta o variabil ca parametru i trebuie s
aib acea variabil definit atunci cnd o apelezi. Voi explica i acest lucru mai ncolo. Iat
funcia mai jos:
Cod:
<?php
// Folosim o functie cu variabile
function scoate_imag($cevahtml)
{
$cevahtml = preg_replace( "/(<img)(.*?)(>)/si" , "" , $cevahtml);
return $cevahtml;
}
?>
Acum, nchidem clasa noastr i suntem gata s-o folosim!
I
S numim acest fiier: >%ls:lasa_'ea.php> i s vedem cum l vom folosi n pagina urmtoare.
Folosirea acestei Clase n Scripturile voastre PHP
Primul lucru pe care trebuie s-l facem este s includem clasa. Nu este mare lucru, doar
includei-o folosind:
SA
in%l*,e >:lasa_'ea.php>E
Acum putem ncepe distractia :)
Avem clasa noastr inclus n script i trebuie s iniializm un obiect pe care s-l atribuim
unei variabile. Iat cum se face:
$%lasa_$ea = PNe9 :lasa_'eaE
Am creat un obiect numit $%lasa_$ea i acum putem accesa elementele din interiorul clasei
:lasa_'ea pe care am creat-o mai devreme. Astea fiind fcute, avem variabila >$e$ail> ce st
degeaba n :lasa_'ea, aa ca i vom atribui o valoare:
$%lasa_$ea RN e$ail = >t*]*n,eCa.%o$> E
Tinei minte c putei face: $%lasa_$eaRNe$ail = $_POST['e$ail'E sau orice vrei cu ea.
S rulm funcia Ceri&i%a_e$ail n interiorul clasei :lasa_'ea:
Cod:
<?php
$verifica_email = $clasa_mea -> verifica_email();
if (!$verifica_email)
{
echo "Adresa de email nu este valida!";
}
else
{
echo "Adresa de email este valida!";
}
?>
Tot ce am fcut este s atribuim o variabil funciei Ceri&i%a_e$ail/0 i apoi am fcut nite
verificri de erori pe baza acelei variabile. Tinei minte ce a spus mai devreme, dac
Ceri&i%a_e$ail returneaz TRUE, adresa coninut n variabila $e$ail pe care i-am spus s-o
verifice a trecut testul, dac nu a trecut testul va returna FALSE. Privind instruciunea i& de
mai sus, vei vedea c dac un "!" sau "Eroare" este detectat pe irul de caractere din
$Ceri&i%a_e$ail, vom afia >A,resa ,e e$ail este Cali,a7>.
Haidei s ne uitm cum folosim funcia s%oate_i$ag. nti vom crea un string cu HTML n
interior.
$ht$l_Ce%hi = 'SstrongNA$ o i$agine ai%i! Si$g sr%=>"i$aginea_$ea.4pg> height=><QQ>
9i,th=> =QQ> N' E
Acum c avem $ht$l_Ce%hi i tim c are o imagine n interiorul HTML-ului, s scoatem acea
imagine afar i s returnm rezultatul:
$ht$l_no* = $%lasa_$ea RN s%oate_i$ag/$ht$l_Ce%hi0E
e%ho >Ai%i este ht$lR*l Ce%hi $ht$l_Ce%hi Sbr "NSbr "N> E
e%ho >Ai%i este ht$lR*l no* $ht$l_no* Sbr "NSbr "N> E
Cnd vei privi $ht$l_Ce%hi i $ht$l_no*, vei vedea c imaginea a fost eliminat cu succes.
Dac ai neles ce s-a ntmplat pn acum, felicitrile mele, tocmai ai nvat noiunile
elementare ale claselor! Dac nu, te sftuiesc s mai citeti acest tutorial nc o dat. l vei
nelege pn la urm.
Aa cum am spus mai devreme, clasele s-au dovedit a fi foarte eficiente. Ele sunt calea ctre
>Ob4e%t Oriente, Progra$$ing> sau >Progra$area Orientata pe Obie%te> R OOP. Cu OOP putei
economisi foarte mult timp i putei crea o arhiv de obiecte sau clase pe care le putei folosi
mereu.
Referinte:
Iat cteva link-uri pe care le putei vizita cnd v dezvoltai clasele:
PHP Manual - Classes and Objects
PHP Manual - Extends
PHP Manual - Exending Classes Using Parents
PHP Manual - Classes using :: operator
PHP Manual - Serialize and Unserialize Objects
nchei aici aceast introducere n Clasele PHP.
Toate cele bune!
Sesiuni n PHP
n mod normal, o variabil local declarat ntr-o pagina .php este valabila doar n acea
pagin, dac nu intervenim ntr-un fel pentru a o transfera i pe alte pagini unde avem nevoie
de ea. Modalitile de pstrare a informaiilor pe tot parcursul aplicaiei sunt:
- variabile globale
- sesiuni
- cookies
- transferul variabilelor locale prin forme sau n header-ul unei alte pagini
Ce este o sesiune?
O sesiune reprezint una din cile de a pstra datele de lucru ale unei aplicaii atunci cnd se
face transferul de la o pagin la alta. PHP folosete n mod nativ sesiuni, aa cum fac i
limbajele ASP i ColdFusion. Lucrul cu sesiuni nu este complicat. Fiecare sesiune trebuie
declarat la nceputul paginii, cu ajutorul funciei:
session_start/0E
Aceast funcie face ca PHP s nregistreze un identificator unic al sesiunii (ID), iar acel
identificator este trimis utilizatorului printr-un cookie. Totodat, pe server se creaz un fiier
care va reine valorile variabilelor folosite n aceast sesiune. Fiierul are numele la fel cu
identificatorul ID al sesiunii. Apoi trebuie declarat variabila (sau variabilele) cu care lucrm n
cadrul acestei sesiuni. Pot fi create oricte variabile.
session_register/'sesi*nea_$ea'0E
Variabila $sesi*nea_$ea poate fi o variabil simpl sau un tablou (array). Exemplu:
$sesi*nea_$ea = >L*%ian>E "" Cariabila si$plU
sau
$sesi*nea_$ea[>i,> = <E "" %a;*l *n*i arra3
$sesi*nea_$ea[>n*$e_*tili;ator> = >L*%ian>E
$sesi*nea_$ea[>a,resa> = >Str.Florilor nr.<O>E "" et%.
Variabilele definite n acest mod pot fi folosite pe toate paginile unei aplicaii, definite pe un
domeniu dat, att timp ct cookie alocat acelei sesiuni este activ (nu expir). Folosirea
sesiunilor este o cale mult mai uoara de lucru dect s transferm variabilele de la pagin la
pagin. n php.ini pot fi setate diferite valori pentru parametri legai de sesiune cum ar fi
(dup semnul egal am pus valorile implicite) :
session.%oo)ie_path = >">E
session.%oo)ie_,o$ain = >>E
session.%oo)ie_li&eti$e = >Q>E "" Caloarea Q Vnsea$nU %U %oo)ie pentr* sesi*ne e Calabil p?nU
%?n, bro9ser*l se Ca Vn%hi,e.
session.na$e = >PHPSESS-(>E
i altele .
Exist posibilitatea ca un utilizator s nu accepte setarea de cookies pe computerul su. n
acest caz, pentru identificarea unei sesiuni se poate folosi identificatorul acesteia. Putem
aduga acest identificator n stringul care apleaz o pagin:
Sa hre& = >pagina_$ea.phpASA=S-(A>N:li%) %atre pagina $eaS"aN
<?= este un mod mai scurt de a scrie comanda echo. <?= se poate folosi cu orice variabil,
nu doar cu sesiuni. Un identificator PHPSESSID arat ca o nirurire aleatoare de caractere
alfanumerice:
PHPSESS-( = Q=KKBabKKsa%KMM,aKYJBBBQa&Y==Q<
Dac PHP este compilat cu opiunea enableRtransRi,, atunci identificatorul sesiunii este
adugat automat la fiecare pagin. Iat un exemplu de definire al unei sesiuni:
SA
session_start/0E
session_register/>Cariabila_$ea>0E
$Cariabila_$ea = >A%easta este %*rs*l online ,e PHP>E
AN
$Cariabila_$ea va putea fi folosit apoi pe toate paginile aplicaiei respective.
Observaie important:
Variabilele definite n sesiuni pot fi folosite ntr-o pagin doar dup ce a fost executat comada
session_start/0E Aceast comand i spune PHP-ului s verifice dac exist o sesiune i atunci
s foloseasc variabilele acelei sesiuni ca variabile globale. Funciile session_start/0, ca i
set%oo)ie/0 trebuie folosite ntotdeauna chiar la Gnceputul fiierului. Dac se trimite altceva
ctre browser nainte de folosirea lor atunci vor exista erori la folosirea sesiunii sau a cookie-
urilor.
Articol scris de :*rs http!""php.inter%er.net /prel*at ,e la phpro$ania.net0
Crearea i utilizarea funciilor
Procesul de executare a unei funcii se numete utilizarea, apelarea sau invocarea funciei.
Pentru a folosi o funcie, scriei numele funciei, urmat de o pereche de paranteze.
De exemplu, funcia ran,/0, care genereaz un numr ntreg aleator, poate fi apelat astfel:
ran,/0E
Majoritatea funciilor preiau argumente, reprezentnd valori de intrare care influeneaz
operarea i rezultatul funciei. Pentru a specifica argumente, acestea se insereaz ntre
paranteze; dac specificai mai mult de un argument, fiecare argument trebuie separat de
vecinul su prin intermediul unei virgule. Argumentul unei funii poate fi o valoare literal, o
variabil sau o expresie.
Unele funcii PHP au argumente opionale, care pot fi specificate sau omise, n conformitate cu
inteniile dumneavoastr. De exemplu, funcia ran,/0 are dou argumente opionale. Primul
argument al funciei indic valoarea ntreag cea mai mic pe care o va returna funcia; al
doilea argument indic valoarea cea mai mare. Dac omitei ambele argumente, funcia
returneaz o valoare cuprins ntre 0 i cel mai mare rezultat posibil. Dac dorii, putei
specifica primul argument, omindu-l pe al doilea:
ran,/<QQ0E
Astfel, funcia este obligat s returneze o valoare cuprins ntre 100 i cel mai mare rezultat
posibil.
Ca i ran,/0, majoritatea funciilor returneaz valori. Putei folosi ntr-o expresie valoarea
returnat de o funcie. O situaie foarte frecvent n care se procedeaz astfel o constituie
utilizarea valorii returnate de o funcie ntr-o expresie de atribuire, astfel nct valoarea s fie
accesibil n mod repetat fr a se invoca funcia de mai multe ori.
De exemplu:
$test = ran,/<. <J0E
Cnd se produce o eroare n timpul execuiei unei funcii, PHP genereaz mesaje de eroare.
Uneori, asemenea mesaje de eroare sunt nedorite. n acest caz, putei suprima generarea
mesajelor de eroare prin prefixarea numelui funciei invocate cu ajutorul caracterului @.
De exemplu, pentru a ascunde mesajele de eroare care pot aprea n timpul execuiei funciei
&/0, invocai aceast funcie astfel:
$a = ]&/b0E
Definirea unei funcii
n afar de a utiliza funciile din biblioteca de funcii a limbajului PHP, v putei defini i folosi
propriile funcii. Pentru a defini o funcie, respectai modelul urmtor:
&*n%tion n*$e_&*n%tie/n*$e_arg*$ent0
H
"" ai%i se intro,*%e %orp*l &*n%tiei
I
n acest exemplu, n*$e_&*n%tie este numele funciei, iar n*$e_arg*$ent este numele
argumentului funciei. n PHP, numele funciilor nu prezint sensibilitate la diferena ntre
majuscule i minuscule; ca atare, &/0 i F/0 reprezint referiri la aceeai funcie. Cuvntul cheie
&*n%tion, numele funciei i lista cu argumente alctuiesc antet*l &*n%8iei. Termenul de %orp al
&*n%8iei se refer la instruciunile incluse ntre parantezele acolade care urmeaz dup antetul
funciei. nstruciunile din corpul funciei sunt executate atunci cnd funcia este apelat. Dac
dorii s definii o funcie care nu are argumente, putei omite n*$e_arg*$ent; dac dorii s
definii o funcie cu mai multe argumente, putei include argumente suplimentare dup
n*$e_arg*$ent, fiecare argment fiind separat de vecinul su prin intermediul unei virgule.
Parantezele i numele argumentelor incluse ntre acestea poart numele de lista %*
arg*$ente. Ca exemplu, iat o funcie care calculeaz aria unui dreptunghi:
&*n%tion %al%*lea;a_aria/$inalti$e. $lati$e0
H
ret*rn $inalti$e \ $lati$eE
I
Lista cu argumente a funciei %al%*lea;a_aria include argumentele $lati$e i $inalti$e. Corpul
funciei este alctuit dintr-o singur instruciune; cu toate acestea, corpul unei funcii poate
conine un numr arbitrar de instruciuni. Dac dorii ca funcia s returneze o valoare, trebuie
s determinai funcia s execute o instruciune ret*rn care furnizeaz valoarea respectiv.
Instruciunea ret*rn determin sistarea executrii funciei; nu este necesar ca aceasta s fie
ultima instruciune fizic din corpul funciei. Dac definii o funcie care nu are nici o
instruciune ret*rn, funcia va returna valoarea special NULL.
Apelarea unei funcii
O funcie definit de utilizator poate fi apelat n acelai mod ca o funcie ncorporat. De
exemplu:
$aria = %al%*lea;a_aria/=.O0E
Valorile argumentelor efective 2 i 4 le nlocuiesc pe acelea ale argumentelor formale din
corpul funciei calculeaza_aria, care se comport ca i cum ar fi fost scris astfel:
ret*rn = \ OE
1tenieHH
n PHP3, definiia unei funcii trebuie s precead linia de program care apeleaz funcia.
n PHP4, definiia unei funcii poate fi plasat fie anterior liniei de program care apeleaz
funcia, fie dup aceasta.
Terminarea execuiei unei funcii
O instruciune ret*rn determin sistarea execuiei funciei care o conine. n cazul n care dorii
s sistai prelucrarea unui ntreg script, putei invoca funcia e#it/0. Iat un exemplu:
&*n%tion stop/0
H
e#it/0E
I
e%ho >Pri$a linieSbrN>E
e%ho >Linia =SbrN>E
stop/0E
e%ho >Linia BSbrN>E
Rezultatul acestui script este afiarea primelor 2 linii, dar nu i a liniei 3. Prin apelarea funciei
stop/0 se execut corpul funciei respective; la invocarea funciei e#it/0E execuia scriptului se
ncheie.
Funcii recursive
Este posibil ca o funcie din PHP s se auto-apeleze. O funcie care procedeaz astfel se
numete &*n%tie re%*rsiCa. Este recomandat s nu scriei funcii recursive. Cu toate acestea,
putei scrie accidental o asemenea funcie i de aceea recomand s citii n continuare.
Exemplu:
&*n%tion re%*rsor/0
H
ret*rn re%*rsor/0E
I
$a = re%*rsor/0E
La invocarea funciei re%*rsor/0, aceasta invoc imediat funcia re%*rsor/0, care se auto-invoca
instantaneu. Astfel, funcia re%*rsor/0 este invocat n mod repetat, pn cnd se produce o
eroare cunoscut sub numele de ,epUTire Vn sens po;itiC a stiCei /sta%) oCer&lo90. Dac
programul dvs. se ncheie cu o depire n sens pozitiv a stivei, o posibil cauz poate consta
ntr-o recursie incorect.
Definirea argumentelor prestabilite
PHP4 va permite s definii funcii cu argumente prestabilite. Dac invocai o funcie care are
un argument prestabilit, dar nu furnizai nici o valoare pentru argumentul respectiv,
argumentul ia o valoare prestabilit specificat. Exemplu:
&*n%tion i$po;it_Can;ari/$%antitate. $rata=Q.QY0
H
e%ho >:antitate = $%antitateSbrN>E
e%ho >Rata = $rata>E
ret*rn $s*$a \ $rataE
I
$%*$parat*ri = <=B.OJ
e%ho >:*$parat*ri = $%*$parat*riSbrN>E
$i$po;it = i$po;it_Can;ari/$%*$parat*ri. Q.QM0E
e%ho >-$po;it = $i$po;itSbrN>E
$%*$parat*ri = <=B.OJE
e%ho >:*$parat*ri = $%*$parat*riSbrN>E
$i$po;it = i$po;it_Can;ari/$%*$parat*ri0E
e%ho >-$po;it = $i$po;itSbrN>E
Funcia i$po;it_Can;ari preia dou argumente: un argument obligatoriu, denumit $%antitate,
i un argument prestabilit, denumit $rata. Dac apelai funcia i furnizai un singur argument,
valoarea argumentului respectiv se consider ca fiind valoarea argumentului $%antitate, iar
valoarea 0.07 se foloseste ca valoare a argumentului $rata. Astfel, la prima invocare a
funciei, $rata are valoarea 0.08, specificat drept al doilea argument al funciei. Cu toate
acestea, la a doua invocare a funciei, $rata are valoarea 0.07, deoarece este specificat
valoarea unui singur argument.
Este posibil ca o funcie s aib mai multe argumente prestabilite, dar rezultatul este deseori
confuz. Exemplu:
&*n%tion test/$Caloare< = <. $Caloare= = =0
Care credei c va fi rezultatul dac este invocat urmtoarea funcie?
#=test/B0E
Cu alte cuvinte, argumentul trebuie folosit ca valoare a variabilei $Caloare< sau ca valoare a
variabilei $Caloare=? PHP are reguli care controleaz asemenea situaii, dar regulile respective
pot fi derutante. Ca atare, cel mai bine este s evitai problema prin definirea unui singur
argument prestabilit i prin poziionarea unui argument prestabilit pe ultima poziie n lista cu
argumente.
Utilizarea fiierelor incluse
Funciile PHP v permit s obinei accesul la programe PHP scrise anterior. Una din variante o
constituie instruciunea reD*ire, care are urmtoarea form:
reD*ire/n*$ele_&isier*l*i0E
De exemplu dorim s accesm datele din fiierul numit Calori.in%. Pentru aceasta folosim
urmtoarea comand:
reD*ire/>Calori.in%>0E
Cnd este ncrcat un script PHP care conine o instruciune reD*ire, coninutul fiierului
specificat - cunoscut sub numele de &iTier ,e in%l*,ere - este inserat n script, nlocuind
instruciunea reD*ire. Dac fiierul de includere conine linii de program PHP, trebuie s
includ etichetele SAphp i AN, amplasate n locaiile adecvate.
Dei se obinuiete ca un fiier de includere s primeasc extensia de fiier in%, nu este
obligatoriu s procedai astfel. Unii programatori PHP prefer s foloseasc extensia de fiier
php pentru toate fiierele pe care le creeaz.
Instruciunea reD*ire v poate scuti de un mare volum de munc. De exemplu, s
presupunem ca scriei o aplicaie PHP care este alctuit din mai multe scripturi, iar fiecare
script afieaz o pagina HTML care conine informaii standard n partea de sus a paginii.
Putei crea un fiier script special, denumit antet.in%, care conine doar partea de sus a pagini
(pentru exemplificare citii i vedei scriptul de la articolul "Contruieste un site cu php") Prin
inseria instruciunii:
reD*ire />antet.in%>0E
la nceputul fiecrui script, determinai programul PHP s includ coninutul acelui fiier ca i
cum coninutul respectiv ar face parte din acel script. Acest procedeu poate simplifica
intreinerea programului, deoarece informaiile standard pot fi rezidente ntr-un singur fiier,
ceea ce le face uor de localizat i revizuit.
1tentieHHH
Instruciunea reD*ire este prelucrat la ncrcarea scriptului PHP asociat, naintea legrii
valorilor la variabilele corespunztoare. n consecin, nu putei folosi o expresie pentru a
specifica numele fiierului care urmeaz a fi inclus de ctre o instruciune reD*ire. Totui,
putei folosi instruciunea in%l*,e, care este o instruciune executabil ce determin evaluarea
scriptului PHP dintr-un fiier specificat. De exemplu, instruciunea in%l*,e din urmtorul
program evalueaz fiierul pagina<.in%
$&isier = <E
in%l*,e />pagina>.$&isier.>.in%>0E
La evaluarea fiierului de includere, instruciunile PHP pe care le conine sunt executate ca i
cum ar fi aprut n textul scriptului apelant.
Instruciunea corelat reD*ire_on%e asigur faptul c fiierul specificat este inclus o singur
dat ntr-un script dat. n cazul n care creai fiiere de includere care folosesc instruciunea
reD*ire pentru a include coninutul altor fiiere de includere, putei gsi instruciunea
reD*ire_on%e util.
Funcii PHP pentru expresii regulate
Funcie Descriere
ereg execut o identificare cu o expresie regulat
ereg_replace nlocuiete un sub-ir care corespunde unei expresii regulate
eregi
execut o identificare cu o expresie regulat insensibil la diferena ntre
majuscule i minuscule
eregi_replace
nlocuiete un sub-ir care corespunde unei expresii regulate insensibile la
diferena ntre majuscule i minuscule
split divide un ir ntr-un tablou folosind o expresie regulat
spliti
divide un ir ntr-un tablou folosind o expresie regulat (insensibil la diferena
ntre majuscule i minuscule)
sql_regcase
creaz o expresie regulat insensibil la diferena ntre majuscule i minuscule
dintr-un ir care conine o expresie regulat.
Sintaxa:
function ereg
Semnificaia caracterelor ce se pot afla n ablon:
^ - nceput de ir
$ - Sfrit de ir
* - zero sau mai multe caractere
+ - unul sau mai multe caractere
? - zero sau un character
{x,y}, unde x i y sunt doi ntregi reprezentnd limita inferioar i superioar a numrului de
caractere necesare. x trebuie ntotdeauna definit.
( ) - Secvene de caractere
| - operatorul SI (OR)
. (punct) - reprezint orice caracter
[ ] - orice caracter din intervalul specificat
^ n [ ] - orice altceva dect caracterele din interval
^.[$()|*+?{\ - nu trebuiesc precedate de backslash (\) n expresii regulate dac sunt n
interiorul parantezelor ptrate [ ]
Exemple:
ab* - "a","ab","abb","abbb", etc.
ab+ - "ab","abb","abbb", etc.
ab? - doar "a","ab"
ab{2} - doar "abb"
ab{2,} - "abb","abbb", "abbbb", etc.
ab{2,4} - doar "abb","abbb", "abbbb"
a(bc)* - "abc","abcbc","abcbcbc", etc.
a(bc){1,3} - doar "abc","abcbc","abcbcbc"
(a|b) - "a" sau "b"
hi|hello - "hi" sau "hello"
(b|cd)ef - "bef" sau "cdef"
"^.{3}$" - orice ir cu exact 3 caractere
[_a-zA-Z] - underscore sau orice liter din alfabetul latin
[^a-zA-Z] - orice altceva nafar de litere
[1-6] - numr cuprins ntre 1 i 6
[c-h] - minuscul cuprins ntre c i h
[D-M] - majuscul cuprinsa ntre D i M
Un exemplu mai complicat:
^.{2}[a-z]{1,2}_?[0-9]*([1-6]|[a-f])[^1-9]{2}a+$
Exemplul de mai sus se traduce prin:
Un ir care ncepe cu oricare 2 caractere... ^.{2}
urmat de 1 sau 2 litere minuscule... [a-z]{1,2}
urmat de un underscore opional... _?
urmat de zero sau mai multe cifre... [0-9]
urmat de fie un numr ntre 1 i 6 sau o liter minuscul cuprins ntre a i f... *([1-6]|[a-f])
urmat de 2 caractere care nu sunt cifre... [^1-9]{2}
urmat de unul sau mai multe litere "a" la sfritul irului... a+$
Echivalene:
* - {0,}
+ - {1,}
? - {0,1}
Forma simpl a funciei ereg/0 preia dou argumente: un ir care conine o expresie regulat
i un ir subiect. Funcia returneaz tr*e dac expresia regulat corespunde unui sub-ir al
irului subiect; n caz contrar, returneaz &alse.
Iat un exemplu mai simplu:
$$o,el=>[s$lat>E
$s*bie%t=>La noi in sat>E
$re;*ltat=ereg/$$o,el. $s*bie%t0E
Variabila $re;*ltat primete valoarea tr*e, deoarece irul subiect conine sub-irul "sat", care
corespunde expresiei regulate.
Forma mai complex a funciei ereg/0 include un al treilea argument, un tablou care primete
sub-iruri ce corespund poriunilor scrise ntre paranteze ale modelului. n scriptul de mai jos,
este reprezentat modul de utilizare a acestei forme a funciei ereg/0, pe care o folosete
pentru a determina dac un ir conine o adres de e-mail corect format.
Cod:
// formularul html
<form method="post" action="script_2.php">
Sir:
<input type="text" name="sir">
<br>
Expresie regulata:
<input type="text" size=64 name="model"
value="^([_a-zA-Z0-9-]+)@([a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*)$">
<br>
<input type="submit">
</form>
<?php
// preluare valori din formular
$sir = $_POST['sir'];
$model = $_POST['model'];
// Afisare date
echo "<br>Sir: ".$sir;
echo "<br>Expresie regulata: ".$model;
// verificare
if (get_magic_quotes_gpc())
{
echo "<br>Eliminarea ghilimelelor magice";
$sir = stripslashes($sir);
$model = stripslashes($model);
echo "<br>Sir: ".$sir;
echo "<br>Expresie regulata: ".$model;
}
$gasit = ereg($model, $sir, $echivalente);
echo "<br>";
if ($gasit)
{
echo "<br>Valabil: true";
echo "<br>Componente: ";
for ($i=0;$i<count($echivalente);$i++)
{
echo "<br>$echivalente[$i]";
}
}
else
echo "<br>Valabil: false";
?>
Funcia PHP ss%an&/0, adugat n versiunea PHP 4.01, este complementar funciei print&/0.
Dac funcia print&/0 genereaz date de ieire formatate, funcia ss%an&/0 citete un ir, l
interpreteaz prin referirea la un ir de formatare i stabilete valorile variabilelor specificate
n funcie de coninutul irului.
Exemplu:
Cod:
<?php
$subiect = "01, 31, 2005";
$n = sscanf($subiect, "%d, %d, %d", &$luna, &$zi, &$an);
echo "<br>Au fost gasite $n valori:";
echo "<br>luna=$luna";
echo "<br>zi=$zi";
echo "<br>an=$an";
?>
Datele de ieire ale acestui exemplu sunt:
Citat:
Au fost asite - #alori&
luna=*
zi=-*
an=+,,'
Utilizarea referinelor n PHP
n mod prestabilit, argumentele transferate unei funcii PHP sunt transmise prin Caloare, ceea
ce nseamn c valorile argumentelor sunt copiate i funciile utilizeaz copii ale valorilor
argumentelor lor, nu argumentele n sine. Ca o consecin, o funcie PHP nu poate modifica
valorile argumentelor sale. Acest fapt este n general util, deoarece astfel funciile devin mai
uor de neles dac se limiteaz la a returna o valoare, fr a modifica valori.
Totui, putei stabili ca o funcie s aib posibilitatea de a modifica valoarea unui argument,
specificnd ca argumentul s fie transferat prin re&erin8U. Cnd un argument este transferat
prin referin, valoarea sa nu este copiat; funcia lucreaz cu valoarea argumentului i are
libertatea de a modifica acea valoare. Pentru a specifica faptul c un argument urmeaz a fi
transferat prin referin, argumentul va fi prefixat cu un caracter ampersand (&) (mai
cunoscut ca AND). Putei ataa acest prefix la argument n antetul funciei sau n apelul la
funcie. Iat un exemplu care prezint apelul prin valoare i apelul prin referin:
Cod:
<?php
function prin_valoare($x)
{
$x = 1;
}
function prin_referinta(&$x)
{
$x = 1;
}
$y = 0;
prin_valoare($y);
echo "<br>\$y=$y";
$y = 0;
prin_valoare(&$y);
echo "<br>\$y=$y";
$y=0;
prin referinta($y);
echo "<br>\$y=$y;
?>
Dac rulai acest script, vei obine urmtoarele date de ieire:
Citat:
$y=,
$y=*
$y=*
Reinei c scriptul conine dou funcii, i anume prin_Caloare/0 i prin_re&erinta/0. Fiecare
funcie preia un singur argument, denumit $#. Antetul funciei prin_re&erinta/0 specific faptul
c argumentul sau este transferat prin referin; argumentul funciei prin_Caloare/0 este
transferat prin valoare, n conformitate cu practica prestabilit folosit n limbajul PHP. Fiecare
funcie ncearc s modifice valoarea argumentului su.
Primul paragraf al programului invoc funcia prin_Caloare/0, transfernd argumentul prin
valoare. n consecin, funcia lucreaz cu o copie a argumentului su, iar valoarea variabilei
$3 nu se modific.
Cel de-al doilea paragraf al programului invoc de asemenea funcia prin_Caloare/0; cu toate
acestea, folosete un caracter ampersand pentru a determina transferul prin referin al valorii
variabilei $3. n consecin, funcia modifica valoarea argumentului su, care se transforma
din 0 n 1.
Cel de-al treilea paragraf al programului invoc funcia prin_re&erinta/0. Antetul funciei
respective folosete un caracter ampersand pentru a specifica faptul c valoarea argumentului
sau este transferat prin referin. n consecin, funcia modific valoarea argumentului sau,
care se transform din 0 n 1.
Prin utilizarea referinelor se evit suprasarcina de copiere a valorilor argumentelor i implicit
se obine o vitez mai mare de execuie a programului. Cu toate acestea, programele devin
astfel mai dificil de neles, iar referinele sau apelurile prin referin pot cauza erori de
program. Cel mai indicat este s evitai referinele, acolo unde este posibil, i s definii funcii
care returneaz valori, i nu funcii care modific valorile propriilor argumente.
Lucrul cu funcii list
n afar de modalitile de parcurgere iterativ a tablourilor, PHP ofer numeroase funcii care
permit traversarea tablourilor, deplasndu-v nainte sau napoi, dup dorin. Prima dintre
aceste funcii este %*rrent/0, care returneaz valoarea curent a tabloului. Funcia %*rrent/0
folosete un pointer intern de tablou pe care PHP l creeaz pentru fiecare tablou. Cnd creai
un tablou, pointerul intern de tablou este configurat astfel nct s fac referire la primul
element al tabloului. Funciile ne#t/0 i preC/0 modific pointerul intern al tabloului i se pot
folosi alturi de funcia %*rrent/0 pentru a parcurge un tablou. Funcia ne#t/0, aa cum i arat
i numele, modific pointerul intern al tabloului astfel nct acesta s fac referire la urmtorul
element, n timp ce funcia preC/0 modific pointerul intern al tabloului astfel nct acesta s
fac referire la elementul anterior. Iat un exemplu care prezint modul de operare al celor 3
funcii:
Cod:
<?php
$test = array(10=>"aaa", 20 => "bbb", 21 => "ccc");
$curent = current($test);
echo "<br>functia current() a returnat $curent";
$urmator = next($test);
echo "<br>functia next() a returnat $urmator";
$urmator = next($test);
echo "<br>functia next() a returnat $urmator";
$anterior = prev($test);
echo "<br>functia prev() a returnat $anterior";
?>
Datele de ieire sunt:
Citat:
functia current(! a returnat aaa
functia next(! a returnat ...
functia next(! a returnat ccc
functia pre#(! a returnat ...
Funcia key()
Funcia )e3/0 este corelat cu funcia %*rrent/0. Dac funcia %*rrent/0 returneaz valoarea
asociat elementului curent, funcia )e3/0 returneaz cheia asociat elementului curent.
Exemplu:
Cod:
<?php
$test = array(10=>"aaa", 20 => "bbb", 21 => "ccc");
$curent = current($test);
$cheie = key($test);
echo "<br>functia current() a returnat $curent";
echo "<br>functia key() a returnat $cheie";
?>
Datele de ieire sunt:
Citat:
functia current(! a returnat aaa
functia /ey(! a returnat *,
Funcia each()
O alt funcie util n parcurgerea tablourilor este ea%h/0. Funcia ea%h/0 returneaz
urmtoarea pereche cheie-valoare din tabloul specificat. Perechea cheie-valoare este returnat
sub forma unui tablou asociativ cu patru elemente, dup cum urmeaz:
Cheie Valoare
0 Componenta cheie a perechii cheie-valoare curent
1 Componenta valoare a perechii cheie-valoare curent.
"key" Componenta cheie a perechii cheie-valoare curent
"value" Componenta valoare a perechii cheie-valoare curent.
Observai c putei folosi valoarea cheie "0" sau "cheie" pentru a obine accesul la componenta
%heie a perechii cheie-valoare; similar, putei folosi valoarea cheie "1" sau "valoare" pentru a
obine accesul la componenta Caloare a perechii cheie-valoare. Iat mai jos un exemplu al
funciei ea%h/0:
Cod:
<?php
$test = array(10=>"aaa", 20 => "bbb", 21 => "ccc");
$fiecare = each($test);
$zero = $each[0];
$unu = $each[1];
$cheie = $each['key'];
$valoare = $each['value'];
echo "<br>zero = $zero";
echo "<br>unu = $unu";
echo "<br>cheie = $cheie";
echo "<br>valoare = $valoare";
?>
Datele de ieire sunt:
Citat:
zero = *,
unu = aaa
cheie = *,
#aloare = aaa
Funcia list()
O alt funcie util n lucrul cu tablouri este funcia list/0, care v permite s atribuii valori la
numeroase variabile n cadrul unei instruciuni. Funcia list/0 este deseori folosit cu funcia
ea%h/0, deoarece funcia list/0 faciliteaz accesul separat la cheia i la valoarea returnate de
funcia ea%h/0. Forma generala de utilizare a funciei list/0 este:
list/$Car<. $Car=. .... $Carn0 = Caloare_tablo*E
Fiecare dintre variabilele specificate, de la $Car< la $Carn, primete o valoare din tabloul
Caloare_tablo*. ntr-un fel, funcia list/0 este opus funciei arra3/0, deoarece funcia list/0
mparte un tablou ntr-o serie de valoari scalare, n timp ce funcia arra3/0 construiete un
tablou dintr-o serie de valori scalare. Iat un exemplu de utilizare a funciei list/0:
Cod:
<?php
$test = array(10=>"aaa", 20 => "bbb", 21 => "ccc");
list($cheie, $valoare) = each($test);
echo "<br>cheie = $cheie, valoare = $valoare";
$urmator = $next($test);
echo "<br>urmator = $urmator";
?>
Datele de ieire sunt:
Citat:
cheie = *,, #aloare = aaa
urmator = ...
PHP conine peste 40 de funcii pentru lucrul cu tablourile. De exemplu, funcia arra3_sear%h/0
faciliteaz cutarea ntr-un tablou.
Sortarea tablourilor
Sortarea reprezint o alt operaie frecvent aplicat tablourilor. PHP furnizeaz o suit de
funcii care faciliteaz sortarea unui tablou. De exemplu, un tablou poate fi creat dup cum
urmeaz:
$li$ba4e = arra3/<=N>Perl>. ==N>PHP>. O=N>P3thon>0E
Apoi, dorii s sortai tabloul n funcie de numele limbajului de programare. Pentru aceasta,
pur i simplu invocai funcia sort/0:
sort/$li$ba4e0E
Dup sortare, coninutul tabloului apare aa:
Q =N PHP
< =N Perl
= =N P3thon
Observai c se%Cen8a ,e sortare sau se%Cen8a ,e aran4are (cum este numit uneori) este
sensibil la diferena dintre majuscule i minuscule. Deoarece litera H mare este sortata
anterior literei e mic, PHP apare nainte de P3thon n datele de ieire sortate. Tabelul de mai
jos prezint pe scurt funciile de sortare ale limbajului PHP, inclusiv rezultatul aplicrii fiecrei
funcii tabloului folosit n exemplul anterior.
Operaie Funcie Rezultat
Sortarea unui tablou n funcie de valoare sort()
0 => PHP
1 => Perl
2 =>
Python
Sortarea unui tablou asociativ n funcie de valoare asort()
2 => PHP
1 => Perl
4 =>
Python
Sortarea unui tablou dup valoare, n ordine descendent rsort()
0 =>
Python
1 => Perl
2 => PHP
Sortarea unui tablou asociativ dup valoare, n ordine descendent Arsort()
4 =>
Python
1 => Perl
2 => PHP
Sortarea unui tablou sau a unui tablou asociativ n funcie de cheie ksort()
1 => Perl
2 => PHP
4 =>
Python
Sortarea unui tablou sau a unui tablou asociativ n funcie de cheie, n
ordine descendent
Krsort()
4 =>
Python
2 => PHP
1 => Perl
Dac dorii s efectuai o cutare fr sensibilitate la diferena ntre majuscule i minuscule, o
modalitate ar fi utilizarea funciei nat%asesort/0, care sorteaz un tablou folosind o "ordine
natural", care nu este sensibil la diferena ntre majuscule i minuscule. O alt modalitate
const n a utiliza funcia *sort/0 sau una dintre funciile sale conexe, n spe *)sort/0 i
*asort/0. Aceste funcii v permit s definii o secven de aranjare personalizat, pe care o
specificai prin desemnarea unei funcii care compar valorile n conformitate cu secvena de
aranjare. Funcia *sort/0 sorteaz valorile din tablou i returneaz un tablou secvenial; funcia
*)sort/0 sorteaz cheile tabloului, iar funcia *asort/0 sorteaz un tablou asociativ. De
exemplu, urmtoarele instruciuni creeaz un tablou i l sorteaz ntr-o manier insensibil la
diferena ntre majuscule i minuscule:
$li$ba4e = arra3/>Perl>. >PHP>. >P3thon>0E
*sort/$li$ba4e. >str%$p%ase>0E
Funcia str%$p%ase/0 este o funcie din biblioteca PHP care compar dou iruri fr a ine
cont de mrimea literelor (majuscule sau minuscule). Funcia returneaz o valoare negativ
dac primul ir este mai mic dect al doilea, zero dac irurile sunt identice, respectiv o
valoare pozitiv dac primul ir este mai mare dect ala doilea. Putei implementa o secven
de aranjare personalizat scriind propria dumneavoastr funcie i specificnd numele acesteia
ca argument al funciei *sort/0 sau al uneia din funciile sale conexe. Pur i simplu scriei o
funcie care preia dou argumente ir i returneaz -1, 0 sau =1, n funcie de rezultatul
comparaiei ntre valorile ir.
Interoperabilitate PHP-Java
Un aspect important al limbajului PHP este acela c realizatorii de pagini web pot folosi n
script-uri o mare parte a facilitilor oferite de limbajul ^aCa prin intermediul unei biblioteci de
funcii numit php_4aCa. Pentru a utiliza facilitile oferite de limbajul ^aCa n cadrul script-
urilor PHP este necesar o platform ^aCa care poate fi gsit la adresa http://java.sun.com/
i pachetul php_4aCa care conine dou fiiere: biblioteca php_4aCa.,ll (pe platforme Windows)
i pachetul php_4aCa.4ar care conine o clas care se ocup de ncrcarea celor folosite n
script-urile PHP. Aceast clas este utilizat de ctre PHP pentru a executa funcii din clase
^aCa i pentru a rula clase noi. Limbajul PHP poate utiliza cel puin urmtoarele versiuni de
^aCa: 1.2.x, 1.3.x, 1.4.2. Eu am testat cu ^aCa = S([. Stan,ar, E,ition <.O.=_QO
Cele dou fiiere ale pachetului php_4aCa pot fi gsite n versiunea integral a limbajului PHP
(n directorul php"e#tensions" de pe hdd)
Instalare:
Pentru a utiliza aceast facilitate trebuie instalat platforma Java i cele dou fiiere ale
pachetului php_4aCa trebuie copiate n directorul e#tensions care poate fi gsit n directorul n
care a fost instalat limbajul PHP.
Configurare:
Pentru a putea accesa clasele Java n cadrul script-urilor PHP trebuie configurat biblioteca
php_4aCa. Configurarea se realizeaz prin intermediul fiierului php.ini localizat pe platforme
Windows n directorul sistemului de operare (n directorul Fin,o9s de obicei). n acest fiier
trebuie adugat valoarea php_4aCa.,ll variabilei e#tension. Exist mai multe posibiliti
pentru a face acest lucru. Una dintre ele este eliminarea caracterului ";" de la nceputul liniei:
Ee#tension=php_4aCa.,ll
dac o astfel de linie exist n fiierul php.ini, iar o alt varianta este adugarea liniei:
e#tension=php_4aCa.,ll
la sfritul fiierului. n continuare trebuie setate valori pentru urmtoarele patru variabile:
- 4aCa.%lass.path - reprezint o list de directoare, arhive zip sau alte tipuri de pachete
suportate de limbajul java (4ar. e4b. 9ar etc.) separate ntre ele prin caracterul ";" aceast
list ar trebui s conin calea ctre pachetul php_4aCa.4ar, altfel nu se pot utiliza clase Java;
- 4aCa.ho$e - reprezint numele directorului n care este instalat platforma Java;
- 4aCa.librar3 - reprezint calea ctre maina virtual Java care se dorete a fi ncrcat;
- 4aCa.librar3.path - reprezinta o list de directoare n care pot fi gsite anumite pachete de
clase Java, n plus dect cele cu care este configurat platforma Java; directoarele din aceast
list sunt separate ntre ele prin caracterul ";"
Valorile pentru aceste variabile se seteaz n fiierul php.ini n cadrul sectiunii [Java].
(in cazul meu am setat astfel valorile:
[^aCa
4aCa.%lass.path=%!ZphpZe#tensionsZphp_4aCa.4ar
4aCa.ho$e=%!Z4=s,)<.O.=_QO
4aCa.librar3=:!Z4=s,)<.O.=_QOZ4reZbinZserCerZ4C$.,ll
4aCa.librar3.path=%!ZphpZe#tensionsZ
Cu aceste setri fcute, maina virtual Java poate fi ncrcat i clasele pot fi utilizate n
cadrul script-urilor PHP.
Utilizare
Clasele Java se instaniaza n PHP folosind constructorul clasei Java explicat mai jos. Metodele
i proprietile statice sau dinamice ale claselor instaniate se acceseaz folosind operatorul de
indirectare "->". De exemplu, dac avem o variabil $%lasa creia i-a fost ataat ca valoare o
clas Java, atunci pentru a afia reprezentarea textual a acesteia trebuie s utilizm metoda
toString/0 (metod specific tuturor claselor Java) vom utiliza o instruciune de forma:
e%ho $%lasaRNtoString/0E
Clasa Java
Aceast clas se folosete pentru a rula o clas a limbajului Java i reprezint, de fapt, o clas
derivat din clasa 4aCa.lang.Ob4e%t a limbajului Java. Constructorul acesteia primete mai
muli parametrii, dintre care primul este un ir de caractere care reprezint numele clasei Java
care se instaniaz, iar restul de parametrii reprezint parametrii pentru care se va apela
constructorul clasei respective. n cazul n care nu se reuete rularea unei clase a limbajului
Java este generat o excepie Java, iar pentru a verifica dac a fost generat o astfel de
excepie se folosete funcia 4aCa_last_e#%eption_get care este prezentat mai jos. n
continuare este un exemplu de utilizare a clasei Java, cu care putei verifica dac ai instalat i
configurat corect clasele Java.
Cod:
<?php
$system = new Java("java.lang.System");
echo "Versiunea Java este: ";
echo $system -> getProperty("java.version")."<br>";
echo "Sistem de operare: ";
echo $system -> getProperty("os.name")."<br>";
echo "Versiunea: ";
echo $system -> getProperty("os.version")."<br>";
?>
Funcia java_last_exception_get
Aceast funcie returneaz o clas Java derivat din clasa 4aCa.lang.E#%eption care reprezint
ultima exceptie care a fost generat sau valoarea logic &alse dac nu a fost generat nici o
excepie de la nceputul execuiei script-ului sau de la ultimul apel al funciei
4aCa_last_e#%eption_%lear. Funcia 4aCa_last_e#%eption_get nu are parametri.
Cod:
<form action = "test.php" metod=post>
Introduceti un sir de caractere:
<input type = text name = "sir">
<input type = submit value = "verificare">
</form>
<?php
if (isset($_POST['sir']))
{
echo "<hr>";
$int = new Java ("java.lang.Integer");
$sir = $_POST['sir'];
$i = $int->parseInt($sir);
$error = java_last_exception_get();
if ($error)
{
echo "Sirul \"".$sir."\" nu este un numar intreg.";
java_last_exception_clear();
}
else
{
echo "Sirul \"".$i."\" este un numar intreg.";
}
}
?>
Funcia java_last_exception_clear
Aceast funcie nu are nici un parametru i nu returneaz nici o valoare, n schimb efectul
aplicrii ei este acela c este anulat ultima excepie Java care a fost generat de ctre
maina virtual Java n timpul executrii de cod. Apelul acestei funcii este necesar, deoarece,
n cazul n care a fost generat o excepie i nu a fost tratat, se poate ntmpla ca dup
apelul unei funcii s tratam excepia greit.
Importana librriei php_java
Pentru programatorii de pagini web care cunosc att limbajul Java, ct i limbajul PHP,
prezena acestei librrii are o foarte mare importan. Funciile scrise n Java sunt executate
de ctre procesor mult mai repede dect cele scrise n PHP, iar utilizarea codului Java ofer o
mai mare siguran creatorilor de pagini web dinamice.
Transmiterea mesajelor prin e-mail folosind PHP i PEAR
Limbajul PHP are integrat un client pentru protocolul S'TP (Simple Mail Transfer Protocol) i
un set de funcii necesare pentru prelucrarea mesajelor primite de ctre un server de mail n
vederea utilizrii datelor coninute. Cu ajutorul acestor funcii se pot realiza aplicaii
interesante cum sunt administrarea listelor de discuii, transmiterea unor tiri tuturor
utilizatorilor nscrii pe o anumit list, difuzarea de nouti cu privire la diverse apariii etc.
Despre configurarea php
Pentru a putea utiliza funciile oferite de limbajul PHP pentru a trimite mesaje de pot
electronic, pe sistemele de operare din familia Fin,o9s sau \N-G este necesar s se seteze
corect interpretorul PHP prin intermediul fiierului php.ini localizat n directorul n care este
instalat sistemul de operare, respectiv n directorul "et% pe sistemele \N-G.
Funcia $ail/0 trimite mesajele prin intermediul unui server S'TP (Simple Mail Transfer
Protocol) care poate fi gzduit de server-ul pe care este instalat interpretorul PHP sau de ctre
un alt server accesibil interpretorului.
n fisierul php.ini trebuie adugate variabilele avnd numele S'TP, s$tp_port, sen,$ail_&ro$
si sen,$ail_path, dac acestea nu exist, sau trebuie modificate valorile acestora.
- Variabila S'TP reprezint ip-ul sau adresa server-ului de mesaje electronice. Dac aceast
variabil lipseste, atunci, pentru sistemele de operare din familia Fin,o9s se va ncerca
folosirea sistemului pe care se afl instalat interpretorul pentru a transmite mesaje
electronice, iar pentru sistemele de operare din familia \N-G se vor folosi setrile implicite ale
sistemului.
- Variabila s$tp_port reprezint portul pe care rspunde server-ul de mesaje electronice i are
valoarea implicit 25, pentru sistemele de operare din familia Fin,o9s sau setarea implicit a
sistemului, pentru sistemele de operare din familia \N-G.
- Variabila sen,$ail_&ro$ reprezint adresa de mail a expeditorului. Valoarea acestei variabile
este folosit numai pentru sistemele de operare din familia Fin,o9s, iar pe sistemele de
operare din familia \N-G se folosete setarea implicit a sistemului.
- Variabila sen,$ail_path reprezint calea ctre aplicaia care se ocup de transmiterea
mesajelor pe sistemele de operare din familia \N-G.
Funcia mail
Aceast funcie se folosete pentru a transmite un mesaj de pot electronic la una sau mai
multe csue potale. Funcia $ail are cinci parametri de tip ir de caractere, dintre care
ultimii doi sunt opionali.
- Primul parametru reprezint o list a tuturor csuelor potale, separate prin caracterul ","
care reprezint destinatarii mesajului ce se va transmite. O csu potal din lista
destinatarilor poate fi specificat utiliznd unul dintre urmtoarele formate: "n*$e_,estinatar
Sa,resa_e$ailN" sau "a,resa_e$ail", unde n*$e_,estinatar reprezint numele proprietarului
csutei potale a,resa_$ail i poate fi irul vid, iar a,resa_e$ail reprezint adresa csuei
potale i are formatul "n*$e_*tili;ator],o$eni*", unde ,o$eni* reprezint numele serCer-
ului care gzduiete csua potala a utilizatorului n*$e_*tili;ator. n cazul utilizrii primului
format, pentru a specifica un destinatar pentru mesajul care se va trimite, este obligatorie
folosirea caracterelor "<" i ">" nainte, respectiv dup cmpul a,resa_e$ail, iar dac
valoarea cmpului n*$e_,estinatar conine caracterul spaiu este necesar utilizarea
caracterului " naintea acestuia i dup acesta. De exemplu, adresa >Ale# SphpO]as.roN> este
o adres valid pentru un mesaj de pot electronic.
- Al doilea parametru reprezint subiectul mesajului care se va transmite.
- Cel de-al treilea parametru reprezint coninutul mesajului ce va fi transmis. Pentru a putea
trimite mesaje care conin ataamente sau care au un tip de continut altul decat text (exemplu
pagini HTML) este necesar ca valoarea acestui parametru sa fie n format MIME (Multi-porpose
Internet Mail Extension).
- Cel de-al patrulea parametru reprezint o list de linii de antet suplimentare, separate prin
irul de caractere "\r\n" (sfrit de linie), pentru mesajul care va fi transmis.
- Ultimul parametru reprezint o list de opiuni suplimentare pentru aplicaia care va fi
folosit pentru a efectua trimiterea mesajului i este dependent de aceasta.
Funcia returneaz valoarea logic TR5E dac s-a reuit trimiterea mesajului i valoarea logic
FALSE n caz contrar. Un exemplu este prezentat mai jos:
$ail/'>Ale#> SphpO]as.roN'. >'esa4 ,e test>. >A%esta este *n $esa4 ,e test>0 or ,ie/>N* se
poate tri$ite $esa4*l>0E
PEAR
PEAR (PHP Extension and Application Repository) reprezint un proiect demarat de echipa de
programatori PHP. Scopul acestui proiect este de a oferi o bibliotec structurat de clase
openRso*r%e tuturor utilizatorilor limbajului PHP. Aceast bibliotec ofer, printre multe altele,
un set de clase care pot fi folosite pentru a putea transmite mesaje electronice care s conin
atasamente i al cror coninut poate fi n format HT'L n loc de text. Acest set de clase poate
fi descrcat de la adresa http://pear.php.net/package/Mail_Mime Pentru a putea folosi setul
de clase 'ail_'i$e trebuie instalat mai nti pachetul PEAR de baz care poate fi gsit la
adresa http://pear.php.net/ n continuare este prezentat clasa 'ail_'i$e, cea mai
important clas necesar pentru a codifica n format '-'E astfel de mesaje.
Clasa Mail_Mime
Aceast clas se folosete pentru a construi mesaje electronice n format MIME. Clasa
'ail_'i$e are ase funcii membru a cror funcionalitate este prezentat n continuare i un
constructor. Constructorul 'ail_'i$e creaz o instan a clasei i are un singur parametru de
tip ir de caractere, care este opional. Acest parametru reprezint terminatorul de linie care
va fi utilizat de ctre clasa pentru a ncheia fiecare linie din mesaj i are valoarea implicit
"\r\n".
Funcia Mail_Mime::setTxtBody
Aceast funcie seteaz coninutul text al unui mesaj pentru ca acesta s poat fi vizualizat n
cadrul unui client de mail de tip text cum este cazul aplicaiei mail prezent pe sistemele de
operare din familia \N-G. Aceast funcie are doi parametri.
- Primul parametru este de tip ir de caractere i reprezint coninutul mesajului sau numele
fiierului care conine mesajul n format text.
- Cel de-al doilea parametru este de tip logic i este opional. Dac acest parametru are
valoarea TR5E, atunci se va considera c primul parametru reprezint numele unui fiier, iar
dac are valoarea FALSE, atunci se va considera c primul parametru reprezint coninutul
mesajului. Valoarea implicit a acestui parametru este FALSE. Funcia setT#t2o,3 returneaz
valoarea logic TR5E dac a reuit s adauge la mesaj coninutul i o instan a clasei
PEAR_Error n caz contrar.
Funcia Mail_Mime::setHTMLBody
Aceast funcie seteaz coninutul HT'L al unui mesaj pentru ca acesta s poat fi vizualizat
n cadrul unui client de mail de tip HT'L cum este cazul aplicaiei O5TLOO[ prezent pe
sistemele de operare din familia Fin,o9s. Aceast funcie are doi parametri.
- Primul parametru este de tip ir de caractere i reprezint coninutul mesajului sau numele
fiierului care conine mesajul n format HT'L.
- Cel de-al doilea parametru este de tip logic i este opional. Dac acest parametru are
valoarea TR5E, atunci se va considera c primul parametru reprezint numele unui fiier, iar
dac are valoarea FALSE, atunci se va considera c primul parametru reprezint coninutul
mesajului. Valoarea implicit este FALSE. Funcia setHT'L2o,3 returneaz valoarea logic
TR5E dac a reuit s adauge la mesaj coninutul i o instan a clasei PEAR_Error n caz
contrar.
Funcia Mail_Mime::addHTMLImage
Aceast funcie se folosete pentru a aduga o imagine n corpul unui mesaj, n cazul n care
coninutul n format HT'L utilizeaz imagini integrate. Aceast funcie are patru parametri.
- Primul parametru este de tip ir de caractere i reprezint coninutul imagini sau numele
fiierului care conine imaginea.
- Al doilea parametru este de tip ir de caractere, este opional i reprezint tipul coninutului.
Acest parametru are valoarea implicit "appli%ation"o%tetRstrea$". De exemplu, dac imaginea
este de tip 1-F, acest parametru poate primi valoarea "i$age"gi&".
- Cel de-al treilea parametru este de tip ir de caractere, este opional i reprezint numele
care va fi dat imaginii. n cazul n care primul parametru conine imaginea, atunci este necesar
ca acest parametru s apar, n caz contrar se va folosi numele fiierului transmis ca valoare
pentru primul parametru.
- Cel de-al patrulea parametru este de tip logic i este opional. Dac acest parametru are
valoarea TR5E, atunci se va considera c primul parametru reprezint numele unui fiier, iar
dac are valoarea FALSE, atunci se va considera c primul parametru reprezint coninutul
unei imagini. Valoarea implicit a acestui parametru este TR5E.
Funcia a,,HT'L-$age returneaz valoarea logic TR5E dac a reuit s adauge la mesaj
coninutul i o instan a clasei PEAR_Error n caz contrar.
Funcia Mail_Mime::addAttachement
Aceast funcie se folosete pentru a aduga un fiier la un mesaj i are cinci parametri, dintre
care primii patru au aceai semnificaie cu cei de la funcia precedent. Ultimul parametru este
de tip ir de caractere, este opional i reprezinta tipul codificrii care va fi utilizat. Acest
parametru are valoarea implicit "baseLO". Pentru fiiere ataate care nu sunt binare (ex.
fiiere executabile, arhive...) se poate folosi valoarea "D*ote,Rprintable".
Functia Mail_Mime::headers
Aceast funcie se folosete pentru a aduga linii de antet suplimentare la mesajul constituit
de aceast clas. Funcia hea,ers are un singur parametru de tip list, care are ca i chei
numele cmpurilor antetelor i ca valori, valorile acestor cmpuri. Funcia returneaz o
referin la o list de acelai tip care conine, pe lng elementele transmise ca parametru, i
elementele adugate de aceast clas, pentru ca mesajul s fie recunoscut cum trebuie de
ctre un client de mail. Aceast funcie nu poate fi apelat dup apelul funciei
'ail_'i$e!!get.
Functia Mail_Mime::get
Aceast funcie se folosete pentru a obine coninutul mesajului electronic n format '-'E,
dup ce acesta a fost construit. Funcia get nu are nici un parametru i returneaz un ir de
caractere care reprezint coninutul mesajului electronic codificat n format '-'E.
Pentru a transmite un mesaj folosind funcia $ail prezentat i aceast clas, trebuie prelucrat
irul liniilor de antet returnat de funcia 'ail_'i$e!!hea,ers astfel nct s se obin un ir de
caractere, iar coninutul mesajului va fi constituit de irul de caractere rezultat n urma apelrii
funciei 'ail_'i$e!!get.
Informaii despre clasele ncrcate
n continuare sunt prezentate un set de funcii cu ajutorul crora se pot afla informaii despre
clasele ncrcate ntr-un script.
Funcia get_declared_classes
Aceast funcie returneaz un tablou care conine numele tuturor claselor definite n momentul
execuiei unui script PHP.
Funcia class_exists
Aceast funcie primete ca parametru un ir de caractere i returneaz valoarea logic TR5E
dac exist o clas care s aib numele identic cu irul de caractere primit ca parametru i
valoarea logic FALSE n caz contrar.
Funcia get_parent_class
Aceast funcie are un parametru care poate fi de tip ir de caractere sau obiect. n cazul n
care parametrul este de tipul ir de caractere, atunci funcia get_parent_%lass returneaz un
ir de caractere care reprezint numele clasei care este printele direct al clasei al crui nume
este dat de parametru. n cazul n care parametrul este de tip obiect, atunci funcia returneaz
un ir de caractere care reprezint numele printelui direct al clasei a crei instan este
reprezentat de obiectul dat ca parametru.
Funcia is_a
Aceast funcie are doi parametri. Primul parametru este de tip obiect, iar al doilea este de tip
ir de caractere. Funcia is_a returneaz valoarea logic TR5E dac primul parametru este de
tipul reprezentat de al doilea parametru sau de tip derivat din cel de-al doilea parametru i
valoarea logic FALSE n caz contrar. De exemplu, dac avem clasele %ls<, %ls= i %lsB iar %lsB
este derivat din %ls= iar %ls= este derivat din %ls<, atunci, dac ob4 reprezint o instan a
clasei %lsB, n urma apelurilor is_a/ob4. >%ls<>0. is_a/ob4. >%ls=>0 Ti is_a/ob4. >%lsB>0 se obine
valoarea logic TR5E.
Funcia is_subclass_of
Funcia is_s*b%lass_o& are aceiai parametri cu funcia anterioar. Funcionalitatea ei difer
fa de funcia precedent prin faptul c valoarea logic TR5E este returnat numai n cazul n
care primul parametru este o instan a unui tip derivat din tipul a crui nume este dat de cel
de-al doilea parametru. n condiiile exemplului anterior, n urma apelului is_s*b%lass_o&/ob4.
>%lsB>0 se va obine valoarea logic FALSE.
Funcia get_class_methods
Aceast funcie are un parametru care poate fi de tip ir de caractere care reprezint numele
unei clase sau de tip obiect. Funcia get_%lass_$etho,s returneaz un tablou ale crui
elemente sunt de tipul ir de caractere i care reprezint numele metodelor definite n cadrul
clasei cu numele primit ca parametru sau n cadrul clasei care este reprezentat de obiectul
primit ca parametru. n cazul n care parametrul este de tip ir de caractere i nu este definit
nici o clas cu acest nume, atunci funcia returneaz valoarea logic FALSE.
Functia get_class_vars
Aceast funcie are un singur parametru de tip ir de caractere care reprezint numele unei
clase i returneaz un tablou ale crui elemente sunt de tip ir de caractere i care reprezint
valorile implicite ale variabilelor definite n cadrul clasei. Tabloul rezultat n urma apelului
acestei funcii este indexat dup numele variabilelor definite n cadrul clasei.
Funcia get_class
Aceast funcie primete ca parametru un obiect i returneaz numele clasei care reprezint
tipul obiectului primit ca parametru.
Funcia get_object_vars
Aceast funcie are un singur parametru de tip obiect i returneaz un tablou ale crui
elemente sunt de tip ir de caractere i care reprezint valorile variabilelor definite n cadrul
acestuia. Tabloul rezultat n urma apelului acestei funcii este indexat dup numele variabilelor
definite n cadrul obiectului. Funcia get_ob4e%t_Cars se aseamn foarte mult cu funcia
get_%lass_Cars.
Functia call_user_method
Aceast funcie realizeaz apelul unei metode care aparine unei clase sau unui obiect cu
parametrii specificai. Funcia %all_*ser_$etho, are mai muli parametri. Primul parametru
este de tip ir de caractere i reprezint numele metodei care se va apela. Al doilea parametru
este de tip obiect sau de tip ir de caractere i reprezint numele unei clase. n cazul n care
acest parametru este de tip obiect, metoda dat de primul parametru este apelat pentru
obiect, iar dac parametrul este de tip ir de caractere, atunci metoda este apelat pentru
clasa al crui nume este dat de acest parametru. Restul parametrilor reprezint parametrii cu
care se va apela metoda al crui nume este dat de primul parametru.
Funcia call_user_method_array
Aceast funcie are aceeai funcionalitate cu funcia anterioar cu diferena c are doar trei
parametri, iar al treilea parametru este un tablou unidimensional care conine parametrii cu
care se va apela metoda dat de primul parametru pentru clasa sau obiectul reprezentat de
cel de-al doilea parametru.
Funcia eval
Aceast funcie primete ca parametru un ir de caractere care reprezint o secven de cod
PHP i realizeaz execuia acestuia.
Funcia dl
Aceast funcie realizeaz ncrcarea n timpul execuiei script-ului a unor extensii externe,
dac acest lucru este permis de setrile interpretorului PHP. Funcia ,l primete ca parametru
un ir de caractere care reprezint calea ctre extenia care trebuie ncrcat i returneaz
valoarea logic TR5E dac s-a reuit ncrcarea extensiei i valoarea logic FALSE n caz
contrar.
Funcia extension_loaded
Aceast funcie verific dac o anumit extensie este ncarcat. Funcia primete un
parametru de tip ir de caractere care reprezint numele unei extensii i returneaz o valoare
logic corespunztoare.
Funcia get_declared_classes
Funcia get_,e%lare,_%lasses nu are nici un parametru i returneaz un tablou unidimensional
care conine numele tuturor claselor ncrcate n mediul de execuie n momentul apelrii
acesteia.
Prelucrarea dinamic a imaginilor
Un aspect important al limbajului PHP este acela c ofer programatorilor posibilitatea de a
crea i publica n cadrul paginilor web imagini dinamice cum ar fi de exemplu, o aplicaie care
monitorizeaz accesrile unei pagini web i afieaz rezultatul sub forma unei imagini. Pentru
a profita de aceast facilitate n limbajul PHP trebuie activat mai nti biblioteca php_g,=.
Acest lucru se face prin adugarea urmtoarei linii (dac nu exist deja) n fiierul de
configurare php.ini (pentru sistemele Windows):
e#tension = php_g,=.,ll
n acest moment sunt disponibile funciile de prelucrare i generare dinamic de imagini.
Aceast librrie permite adugarea de text n cadrul imaginilor generate i ofer suport pentru
imagini n mai multe formate. Pentru a obine imagini de calitate foarte bun, aceast
bibliotec ofer suport integrat pentru bibliotecile FreeT3pe <. FreeT3pe = i T<Lib, care au ca
scop ncrcarea i desenarea font-urilor independent de platform.
Formate de imagini suportate
Pentru a afla ce formate de imagini suport biblioteca instalat (n funcie de versiunea PHP)
se poate executa funcia g,_in&o/0.
Cod:
<?php
var_dump(gd_info());
?>
Citat:
array(12) {
["GD Version"]=>
string(27) "bundled (2.0.28 compatible)"
["FreeType Support"]=>
bool(true)
["FreeType Linkage"]=>
string(13) "with freetype"
["T1Lib Support"]=>
bool(true)
["GIF Read Support"]=>
bool(true)
["GIF Create Support"]=>
bool(true)
["JPG Support"]=>
bool(true)
["PNG Support"]=>
bool(true)
["WBMP Support"]=>
bool(true)
["XPM Support"]=>
bool(false)
["XBM Support"]=>
bool(true)
["JIS-mapped Japanese Font Support"]=>
bool(false)
}
Rezultatul returnat de aceast funcie l reprezint un vector cu mai multe componente. Se
poate observa c printre aceste componente se afl versiunea bibliotecii i facilitile oferite.
Formatele de imagini suportate de biblioteca php_g,= sunt 1-F. ^P1. PN1. F2'P Ti G2'
/GP'0. Se observ c biblioteca folosit nu permite salvarea imaginilor n format 1-F.
Crearea dinamica a imaginilor
Pentru a crea imagini n mod dinamic avem la dispoziie dou opiuni. Putem crea o imagine
care este bazat pe o palet de culori (pentru acest tip de imagini avem la dispoziie doar 256
de culori cu care putem opera) sau putem crea o imagine cu un numr neprecizat de culori
(true color). Funciile cu ajutorul crora putem crea imagini sunt:
- i$age%reate - aceast funcie creaz o imagine goal care este bazat pe o palet de culori;
primete ca parametru dou numere ntregi care reprezint dimensiunile imaginii (limea i
nlimea) i returneaz o variabil de tipul reso*r%e care reprezint identificatorul de acces la
imaginea nou creat;
- i$age%reatetr*e%olor - aceast funcie creaz o imagine care are fundalul negru i un numr
nedefinit de culori; primete ca parametri dou numere ntregi care reprezint dimensiunile
imaginii (limea i nlimea) i returneaz o variabil de tipul resource care reprezint
identificatorul de acces la imaginea nou creat.
Trebuie avut n vedere, c pentru a afia o imagine dinamic pe o pagin web trebuie realizat
o pagin care are un element -'1 al crui atribut sr% s indice calea ctre script-ul PHP care
creeaz imaginea.
Cod:
// pagina web contine:
<HTML>
<TITLE>
Imagine dinamica
</TITLE>
<BODY>
<IMG src="imagine.php">
</BODY>
</HTML>
<?php
// pagina imagine.php contine:
header("Content-type: image/png");
$img = imagecreate(100,100);
$fundal = imagecolorallocate($img, 150, 200, 100);
imagepng($img);
imagedestroy($img);
?>
Mai jos avei un exemplu al scriptului prezentat mai sus:
ncrcarea imaginilor
Biblioteca permite, de asemenea, citirea de imagini aflate la o anumit locaie i ncrcarea
acestora n memorie pentru prelucrare i, eventual, publicare. Funciile care ncarc imagini
deja existente sunt:
- i$age%reate&ro$gi& - aceast funcie primete ca parametru o cale spre un fiier, care se
poate afla i la distan, i returneaz o variabil de tipul reso*r%e care reprezint
identificatorul de acces la imaginea de tipul GIF ncrcat;
- i$age%reate&ro$4peg - aceast funcie primete ca parametru o cale spre un fiier, care se
poate afla i la distan, i returneaz o variabil de tipul reso*r%e care reprezint
identificatorul de acces la imaginea de tipul JPG ncrcat;
- i$age%reate&ro$png - aceast funcie primete ca parametru o cale spre un fiier, care se
poate afla si la distan, i returneaz o variabil de tipul reso*r%e care reprezint
identificatorul de acces la imaginea de tipul PNG ncrcat;
- i$age%reate&ro$9b$p - aceast funcie primete ca parametru o cale spre un fiier, care se
poate afla i la distan, i returneaz o variabil de tipul reso*r%e care reprezint
identificatorul de acces la imaginea de tipul WBMP ncrcat;
- i$age%reate&ro$#b$ - aceast funcie primete ca parametru o cale spre un fiier, care se
poate afla i la distan, i returneaz o variabil de tipul reso*r%e care reprezint
identificatorul de acces la imaginea de tipul XBM ncrcat;
- i$age%reate&ro$#p$ - aceast funcie primete ca parametru o cale spre un fiier, care se
poate afla i la distan, i returneaz o variabil de tipul reso*r%e care reprezint
identificatorul de acces la imaginea de tipul XPM ncrcat;
- i$age%reate&ro$string - aceast funcie primete ca parametru un ir de caractere care
conine reprezentarea binar a unei imagini, i returneaz o variabil de tipul reso*r%e care
reprezint identificatorul de acces la imaginea ncrcat.
Cod:
<?php
header("Content-type: image/png");
$im=imagecreatefrompng("images/logo.png");
imagepng($im);
imagedestroy($im);
?>
i exemplul concret l vedei mai jos:
Desenarea de imagini
Pentru a desena pe o imagine creat dinamic sau ncrcat dintr-un fiier avem la dispoziie
mai multe funcii:
- i$agear% - deseneaz pe o imagine un arc de elips; primete ca parametri identificatorul de
acces la imaginea pe care se va desena, coordonata x a centrului elipsei, coordonata y a
centrului eclipsei, lungimea i nlimea elipsei, unghiurile de start i de stop ale arcului i
culoarea cu care se va desena; desenarea se face n sens trigonometric;
- i$age&ille,ar% - deseneaz pe o imagine un arc de elips haurat; are aceeai parametri cu
funcia anterioar la care se mai adaug unul care reprezint stilul haurii i care poate avea
valorile: -'2_AR:_P-E. -'1_AR:_:HOR(. -'1_AR:_NOF-LL. -'1_AR:_E(1E(;
- i$ageline - deseneaz o linie pe imagine; primete ca parametri identificatorul de acces al
imaginii pe care se va desena, coordonata x a primului capt de linie, coordonata y a primului
capt de linie, coordonata x a celui de-al doilea capt, coordonata y a celui de-al doilea capt
i culoarea cu care se va desena linia;
- i$age,ashe,line - deseneaz o linie punctat pe o imagine; are aceeai parametri ca funcia
anterioar i va folosi stilul implicit sau cel setat de utilizator.
- i$agesetthi%)ness - seteaz grosimea cu care se vor trasa liniile pentru o anumit imagine;
primete ca parametri identificatorul de acces al imaginii i un numr ntreg care reprezint
grosimea cu care se vor desena liniile pe imagine;
- i$ageellipse - deseneaz o elips pe o imagine; primete ca parametri identificatorul de
acces al imaginii pe care se va desena, coordonata x i y a centrului elipsei, lungimea i
nlimea elipsei i culoarea cu care se va desena;
- i$age&ille,ellipse - deseneaz o elips plin; are aceeai parametri cu funcia anterioar;
- i$agepol3gon - deseneaz un poligon pe o imagine; primete ca parametri identificatorul de
acces al imaginii pe care se va desena poligonul, un tablou ale crui elemente sunt numere
ntregi i reprezint coordonatele punctelor poligonului care se va desena, numrul de puncte
ale poligonului i culoarea cu care se va desena; tabloul cu punctele poligonului conine pe
pozitiile pare coordonatele x ale punctelor, iar pe pozitiile impare coordonatele y ale punctelor;
- i$age&ille,pol3gon - deseneaz un poligon plin; are aceeai parametri cu funcia anterioar;
- i$agere%tangle - deseneaz un dreptunghi pe o imagine; primete ca parametri
identificatorul de acces al imaginii pe care se va desena, coordonata x i y a colului din partea
stng-sus a dreptunghiului, coordonata x i y a colului din partea dreapta-jos a
dreptunghiului i culoarea cu care se va desena;
- i$age&ille,re%tangle - deseneaz un dreptunghi plin; are aceeai parametri cu funcia
anterioar;
- i$age&ill - umple cu o culoare o zon de pe imagine care are aceeai culoare cu cea a
punctului care se afl la coordonatele specificate ca parametru; primete ca parametri
identificatorul de acces al imaginii pe care se va face umplerea, coordonata x a unui punct din
zona care se va umple cu culoare, coordonata y a punctului i culoarea cu care se va umple.
- i$age&illtobor,er - umple cu o culoare o zon de pe imagine care este mrginit de o culoare
specificat ca parametru; primete ca parametri identificatorul de acces al imaginii pe care se
va face umplerea, coordonata x a unui punct din zona care se va umple cu culoare,
coordonata y a punctului, culoarea punctelor cu care este mrginit zona i culoarea cu care
se va umple;
- i$agesetpi#el - schimb culoarea unui punct de pe o imagine; primete ca parametri
identificatorul de acces al imaginii, coordonata x a punctului a crui culoare se va schimba,
coordonata y a punctului i noua culoare a acestuia;
- i$age%olorat - returneaz culoarea unui anumit punct de pe imagine; primete ca parametri
identificatorul de acces al imaginii, coordonata x a punctului i coordonata y a punctului;
- i$age%olorallo%ate - primete ca parametri identificatorul de acces al unei imagini, o valoare
pentru componenta rou a unei culori, o valoare pentru componenta verde a unei culori i o
valoare pentru componenta albastru a unei culori i returneaz un numr ntreg care
reprezint culoarea avnd cele trei componente; n cazul n care imaginea se bazeaz pe o
palet de culori, atunci se returneaz indicele culorii din palet; dac n paleta de culori nu
exist o culoare care s aib toate cele trei componente, atunci ea este adaugat la paleta de
culori a imaginii;
- i$age%olor,eallo%ate - primete ca parametri identificatorul de acces al unei imagini i o
culoare; n cazul n care imaginea specificat ca parametru se bazeaz pe o palet de culori,
atunci culoarea este eliminat din palet.
Cod:
<?php
header("Content-type: image/png");
$im = imagecreate(250,250);
$red = imagecolorallocate ($im,255,0,0);
$blue = imagecolorallocate ($im,0,0,255);
$green = imagecolorallocate ($im,0,255,0);
$yellow = imagecolorallocate ($im,255,255,0);
$cyan = imagecolorallocate ($im,0,255,255);
$magenta = imagecolorallocate ($im,255,0,255);
imagefill($im,229,229,$cyan);
imagefill($im,30,100,$magenta);
imagefill($im,80,160,$yellow);
imagefilledrectangle($im,0,0,50,100,$red);
imagefilledellipse($im,100,100,50,50,$green);
imagesetthickness($im,3);
$poly = array(10,10,200,50,255,100,150,200,100,75,50,50);
imagefilledpolygon($im,$poly,6,$blue);
imageline($im,0,229,229,0,$red);
imagepng($im);
imagedestroy($img);
?>
Rezultatul exemplului l vedeti mai jos:
Scrierea textului pe imagini
n continuare sunt prezentate cteva funcii utilizate pentru a scrie un text sau un caracter pe
o imagine.
Funcia imagechar
Aceast funcie scrie pe o imagine primul caracter al unui ir de caractere. Funcia i$age%har
are ase parametri:
- primul parametru este identificatorul de acces la imaginea pe care se va desena
- cel de-al doilea parametru reprezint identificatorul de acces la &ont-ul care va fi folosit
pentru a scrie caracterul pe imagine. Acest identificator este de tip numr ntreg i poate avea
valorile predefinite 1, 2, 3, 4 sau 5 sau poate fi un numr returnat de o funcie care ncarc un
font de pe disc.
- cel de-al treilea parametru reprezint coordonata x a colului stnga-sus de unde va ncepe
scrierea caracterului;
- cel de-al patrulea parametru reprezint coordonata y a colului stnga-sus de unde va ncepe
scrierea caracterului;
- al cincilea parametru reprezint irul de caractere din care va fi scris doar primul caracter;
- cel de-al aselea parametru reprezint culoarea cu care se va scrie pe imagine.
Cod:
<?php
header("Content-type: image/png");
$im = imagecreate(100,100);
$fundal = imagecolorallocate($im, 0, 0, 225);
$verde = imagecolorallocate ($im,0,255,0);
imagechar($im, 5, 15, 10, 'a', $verde);
imagepng($im);
imagedestroy($im);
?>
Rezultatul este:
Funcia imagecharup
Aceast funcie scrie un caracter vertical pe o imagine. Are aceeai parametri ca funcia
anterioara.
Cod:
<?php
header("Content-type: image/png");
$im = imagecreate(100,100);
$fundal = imagecolorallocate($im, 0, 0, 225);
$verde = imagecolorallocate ($im,0,255,0);
imagecharup($im, 5, 15, 10, 'a', $verde);
imagepng($im);
imagedestroy($im);
?>
Rezultatul codului de mai sus:
Funcia imagestring
Aceast funcie scrie un text pe o imagine i are aceeai parametri ca funcia i$age%har.
Cod:
<?php
header("Content-type: image/png");
$im = imagecreate(100,100);
$fundal = imagecolorallocate($im, 0, 0, 225);
$verde = imagecolorallocate ($im,0,255,0);
imagestring($im, 5, 15, 10, 'test', $verde);
imagepng($im);
imagedestroy($im);
?>
Rezultatul:
Funcia imagestringup
Aceast funcie scrie vertical un text pe o imagine i are aceeai parametri ca funcia
i$age%har.
Cod:
<?php
header("Content-type: image/png");
$im = imagecreate(100,100);
$fundal = imagecolorallocate($im, 0, 0, 225);
$verde = imagecolorallocate ($im,0,255,0);
imagestringup($im, 5, 15, 40, 'test', $verde);
imagepng($im);
imagedestroy($im);
?>
Rezultatul este:
Funcia imagerotate
Aceast funcie realizeaz rotirea unei imagini n sens trigonometric cu un unghi primit ca
parametru. Imaginea rezultat n urma rotirii va avea dimensiunile egale cu dimensiunile celui
mai mic dreptunghi ale crui laturi sunt paralele cu axele Ox i Oy i care conine imaginea
rotit. Funcia are trei parametri:
- primul reprezint identificatorul de acces la imagine;
- al doilea este de tip real i reprezint unghiul cu care se va roti imaginea;
- al treilea parametru este de tip ntreg i reprezint culoarea cu care se va umple
dreptunghiul care va conine imaginea rotit.
Funcia i$agerotate returneaz un identificator de acces la imaginea rotit.
Cod:
<?php
header("Content-type: image/png");
$im = imagecreate(100,100);
$fundal = imagecolorallocate($im, 0, 0, 225);
$verde = imagecolorallocate ($im,0,255,0);
imagestringup($im, 5, 55, 40, 'test', $verde);
$imrot = imagerotate($im, 45, $verde);
imagepng($imrot);
imagedestroy($imrot);
?>
i rezultatul din exemplul de mai sus este:
Funcia imagetruecolorpalette
Aceast funcie realizeaz transformarea unei imagini care nu folosete o palet de culori ntr-
o imagine care folosete o palet de culori. Funcia i$agetr*e%olorpalette are trei parametri:
- primul reprezint identificatorul de acces al imaginii care va fi transformat;
- cel de-al doilea parametru este de tip logic i reprezint modul n care se va face
transformarea: dac imaginea va fi fr zgomot (valoarea logic FALSE implic o aproximare
mai slab a culorilor); dac imaginea va fi cu zgomot (valoarea TR5E implic o aproximare
mai bun a culorilor);
Funcia jpeg2wbmp
Aceast funcie transform o imagine din formatul ^PE1 n formatul F2'P. Funcia are cinci
parametri. Primul parametru reprezint calea spre fiierul de tip ^PE1 care va fi transformat.
Al doilea parametru reprezint calea spre fiierul care va conine rezultatul transformrii.
Urmtorii doi parametri sunt de tip ntreg i reprezint nlimea i limea noii imagini, iar
ultimul parametru, tot de tip ntreg, reprezint pasul cu care se va parcurge imaginea pentru a
fi transformat.
Funcia png2wbmp
Aceast funcie transform o imagine din formatul PN1 n formatul F2'P. Are aceeai
parametri ca funcia anterioar, cu observaia c primul parametru reprezint calea spre un
fiier de tipul PN1.
Funcia imageinterlace
Aceast funcie seteaz proprietatea interla%e a unei imagini la valoarea logic precizat ca
parametru sau la valoarea logic TR5E dac acest parametru lipsete. Aceast funcie este
foarte important n cazul n care dorii ca site-ul vostru s aib o navigabilitate bun, chiar
dac nu s-au ncrcat integral toate elementele grafice prezente n cadrul lui. n cazul n care
avei o vitez de acces la internet mic sau imaginea pe care dorii s o ncrcai este mare,
nu este nevoie s ateptai ncrcarea ntregii imagini pentru a vedea ce este n ea. O astfel de
imagine se ncarc adaptiv, i n momentul n care s-a ncheiat transferul imaginii ctre
browser, pe imagine se pot observa toate detaliile. De fapt, teoretic vorbind, o imagine este
mprit n subimagini de aceeai dimensiune i calitate diferit (din ce n ce mai bun), care
suprapuse dau ca rezultat imaginea iniial. Practic nu se ntmpl chiar aa, dar efectul
obinut este cel precizat anterior. Funcia are doi parametri. Primul parametru reprezint
identificatorul de acces la imaginea pentru care se dorete setarea proprietii interla%e, iar al
doilea parametru este de tip logic i reprezint valoarea pe care o va avea aceast proptietate.
Cel de-al doilea parametru poate lipsi, dar proprietatea interla%e atribuit unei imagini va primi
valoarea TR5E.
Publicarea n diverse formate
Pentru a publica o imagine generat dinamic se poate utiliza una dintre funciile: i$agegi&,
i$agepng, i$age4peg sau i$age9b$p. Aceste funcii primesc ca parametru un identificator de
imagine i tipresc la ieirea standard imaginea n format 1-F, PN1, ^PE1 sau F2'P. Primele
trei funcii se folosesc pentru a genera o imagine care s poata fi vizualizat ntr-un browser
ncrcat de pe un calculator, iar ultima se folosete pentru ca imaginea generat s poata fi
vizualizat n cadrul unui browser care suport FAP.
Funcii PHP utilizate pentru accesarea i interogarea bazelor de date MySQL
n acest articol voi ncerca s prezint cele mai folosite comenzi PHP pentru lucrul cu bazele de
date MySQL.
Funcia mysql_connect
Aceast funcie realizeaz conectarea la un server MySQL. Funcia $3sDl_%onne%t primete
cinci parametri opionali:
- primul reprezint numele server-ului MySQL i dac lipsete se ncearc conectarea la
calculatorul curent.
- cel de-al doilea reprezint numele utilizatorului i n caz c acesta lipsete se folosete
valoarea root ca nume de utilizator.
- al treilea parametru reprezint parola utilizatorului i n caz c lipsete se folosete irul vid
n momentul conectrii la server.
- al patrulea parametru este de tip logic i are rolul de a indica motorului PHP c n cazul n
care exist o conexiune la acelai server s se mai creeze nc una n loc s se reutilizeze cea
existent.
- ultimul parametru este de tip ntreg i reprezint proprietile pe care le va avea conexiunea.
Acest ultim parametru poate fi o combinaie a valorilor:
a) 'XS_L_:L-ENT_:O'PRESS - indic server-ului c va trebui s trimit date comprimate.
b) 'XS_L_:L-ENT_-1NORE_SPA:E - indic server-ului MySQL faptul c va trebui s ignore
spaiile care urmeaz dup numele funciilor.
c) 'XS_L_:L-ENT_-NTERA:T-VE - indic server-ului MYSQL s nu nchid conexiunea dup
scurgerea unui anumit interval de timp n care script-ul nu a emis cereri ctre acesta.
Funcia $3sDl_%onne%t returneaz valoarea logic FALSE n cazul n care a euat conectarea la
server-ul de baze de date i un identificator de acces la conexiunea ctre server-ul MySQL n
cazul n care conectarea a reuit. n continuare sunt prezentate 2 modaliti de conectare la
un server MySQL:
Cod:
<?php
// varianta 1
$conectare = mysql_connect("nume_server", "user", "parola");
if ($conectare === FALSE)
{
echo "Conectare esuata.";
}
else
{
echo "Conexiune stabilita.";
}
mysql_close($conectare);
// varianta 2
$conectare = mysql_connect("nume_server", "user", "parola") or die("Con
ectare esuata.");
mysql_select_db("nume_tabel", $conectare) or die("Nu se poate alege baza
de date!");
$interogare = "SELECT * FROM nume_tabel";
$resultat = mysql_query($interogare) or die("Nu se poate executa intero
garea!");
// afisare rezultat
// ...
// inchidere conexiune
mysql_close($conectare);
?>
Funcia mysql_close
Aceast funcie primete ca parametru un identificator de acces la o conexiune spre un server
MySQL i realizeaz nchiderea acesteia.
Funcia mysql_ping
Funcia $3sDl_ping verific dac server-ul de MySQL a nchis conexiunea sau nu. Aceasta nu
are nici un parametru i returneaz valoarea logic TR5E n cazul n care conexiunea nu a fost
nchis i valoarea logic FALSE n caz contrar.
Funcia mysql_create_db
Aceast funcie este utilizat pentru a crea o nou baz de date pe server-ul MySQL. Funcia
are doi parametri. Primul este de tip ir de caractere i reprezint numele bazei de date care
va fi creat, iar cel de-al doilea parametru reprezint identificatorul de acces la conexiunea
ctre server-ul MySQL. Funcia returneaz valoarea logic TR5E n cazul n care a reuit s
creeze baza de date i valoarea logic FALSE n caz contrar.
Funcia mysql_drop_db
Aceast funcie este folosit pentru a terge o baz de date. Funcia $3sDl_,rop_,b are doi
parametri. Primul este de tip ir de caractere i reprezinta numele bazei de date care va fi
tears, iar cel de-al doilea parametru reprezint identificatorul de acces la conexiunea ctre
server-ul MySQL. Funcia returneaz valoarea logic TR5E n cazul n care s-a reuit tergerea
bazei de date i valoarea logic FALSE n caz contrar.
Funcia mysql_select_db
Aceast funcie seteaz baza de date pentru o conexiune ctre un server MySQL pentru
interogrile care vor urma. Funcia $3sDl_sele%t_,b are doi parametri. Primul este de tip ir
de caractere i reprezint numele bazei de date care va fi folosit pentru interogrile
ulterioare, iar cel de-al doilea parametru reprezint identificatorul de acces la conexiunea ctre
serverul MySQL. Funcia returneaz valoarea logic TR5E n cazul n care s-a reuit selectarea
bazei de date i valoarea logic FALSE n cazul n care baza de date nu exist sau utilizatorul
nu are drepturi de acces la aceasta.
Funcia mysql_query
Aceast funcie se folosete pentru a interoga o anumit baza de date. Funcia are 3
parametri:
- primul este de tip ir de caractere i reprezint cererea emis server-ului MySQL;
- al doilea parametru reprezint identificatorul de acces al unei conexiuni ctre server;
- al treilea parametru este opional i de tip ntreg i reprezint modul n care va fi returnat
rezultatul.
Ultimul parametru poate avea valorile 'XS_L_5SE_RES5LT sau 'XS_L_STORE_RES5LT. n
cazul n care ultimul parametru lipsete, pentru interogare se va folosi valoarea
'XS_L_STORE_RES5LT, iar rezultatul primit va fi stocat n zone tampon pn cnd va fi
utilizat. Dac, pentru ultimul parametru, se folosete valoarea 'XS_L_5SE_RES5LT, atunci
rezultatul primit nu va fi stocat, deoarece va fi procesat imediat dup apelul funciei. Utilizarea
funciei folosind valoarea 'XS_L_5SE_RES5LT pentru ultimul parametru are acelai efect cu
aplicarea funciei $3sDl_*nb*&&ere,_D*er3 fr a folosi ultimul parametru. Funcia returneaz
o valoare de tip resurs n cazul n care a fost apelat folosind o interogare care presupune
primirea unui rezultat cum sunt comenzile SELE:T, SHOF, EGPLA-N i (ES:R-2E i nu a
aparut nici o eroare, iar n cazul apariiei unei erori, este returnat valoarea logic FALSE. n
cazul n care funcia $3sDl_D*er3 este apelat pentru o interogare care nu presupune primirea
unui rezultat, este returnata valoarea logic TR5E i valoarea logic FALSE n cazul apariiei
unei erori. n continuare avei un exemplu de interogare a unei baze de date. n exemplu se
face selecia primelor 10 nregistrri din tabel:
Cod:
<?php
$conectare = mysql_connect("localhost","root","parola") or die("Nu sa p
utut efectua conectarea la bd.");
mysql_select_db("nume_tabel", $conectare) or die("Nu se poate selecta t
abelul din bd!");
$interogare = "SELECT * FROM nume_tabel LIMIT 0,10";
$rezultat = mysql_query($interogare) or die("Nu se poate executa intero
garea!");
while ($rand = mysql_fetch_array($rezultat, MYSQL_BOTH))
{
echo '<br />'.$rand['coloana_X'];
}
mysql_free_result($rezultat);
mysql_close($conectare);
?>
Funcia mysql_unbuffered_query
Aceast funcie se folosete pentru a interoga o anumit baz de date i are aceeai parametri
cu funcia anterioar. Diferena dintre aceast funcie i $3sDl_D*er3 este aceea c, n cazul
funciei $3sDl_*nb*&&ere,_D*er3, dac ultimul parametru lipsete, se folosete la interogarea
bazei de date valoarea MYSQL_USE_RESULT.
Funcia mysql_real_escape_string
Aceast funcie este util n momentul n care se dorete introducerea n cadrul unei interogri
a unui ir de caractere care nu poate fi interpretat corect de ctre server-ul MySQL i
realizeaz transformarea irului ntr-unul care poate fi interpretat. Funcia
$3sDl_real_es%ape_string are doi parametri. Primul este de tip ir de caractere i reprezint
irul care va fi transformat, iar cel de-al doilea reprezint identificatorul de acces la o
conexiune ctre un server MySQL. Funcia returneaz un ir de caractere care poate fi
interpretat corect de ctre server-ul MySQL. De exemplu, dac apelm aceast funcie pentru
irul de caractere "('apoi" vom obine rezultatul "(Z'apoi", deoarece caracterul ' (apostrof) are
o alt semnificaie pentru server-ul MySQL dac nu e precedat de caracterul "\".
Funcia mysql_free_result
Aceast funcie se folosete pentru a elibera memoria alocat stocrii unui rezultat primit n
urma unei interogari de la un server MySQL. Funcia $3sDl_&ree_res*lt are un singur
parametru, i anume o variabil de tip resurs a crei valoare a fost setat folosind una dintre
funciile $3sDl_D*er3 sau $3sDl_*nb*&&ere,_D*er3. Funcia returneaz valoarea logic TR5E
n cazul n care a reuit s elibereze memoria utilizat de variabila de tip resurs primit ca
parametru i valoarea logic FALSE n caz contrar.
Funcia mysql_num_rows
Aceast funcie returneaz numrul de nregistrri coninute de ctre un rezultat primit de la
server-ul MySQL. Funcia $3sDl_n*$_ro9s are un singur parametru, i anume o variabil de
tipul resurs a crei valoare a fost setat folosind una dintre funciile $3sDl_D*er3 sau
$3sDl_*nb*&&ere,_D*er3. Funcia returneaz un numr ntreg care reprezint numrul de
nregistrri coninute de variabila de tip resurs primit ca parametru. n continuare este un
exemplu de utilizare a acestei funcii. n exemplu se afieaz numrul total de nregistrri din
tabel.
Cod:
<?php
$conectare = mysql_connect("localhost", "user", "parola") or die("Nu se
poate conecta la server");
mysql_select_db("nume_bd", $conectare) or die("Nu se poate selecta baza
de date");
$rezultat = mysql_query("SELECT * FROM nume_tabel", $conectare)
or die("Nu se poate face interogarea la baza de date");
$total = mysql_num_rows($rezultat);
echo "In tabel exista ".$total." inregistrari in acest moment.";
mysql_free_result($rezultat);
mysql_close($conectare);
?>
Funcia mysql_info
Aceast funcie returneaz un ir de caractere care conine informaii referitoare la ultima
interogare a unei baze de date n urma creia nu s-a primit nici un rezultat, cum este cazul
funciilor -NSERT sau 5P(ATE. Funcia $3sDl_in&o are un singur parametru care reprezint
identificatorul de acces al unei conexiuni spre un server MySQL.
Funcia mysql_affected_rows
n cazul interogrilor n urma crora nu se obine nici un rezultat, se poate folosi funcia
$3sDl_a&&e%te,_ro9s pentru a verifica numrul de nregistrri care au fost actualizate la ultima
nterogare a bazei de date, pentru celelalte tipuri de interogri putndu-se folosi funcia
$3sDl_n*$_ro9s. Funcia $3sDl_a&&e%te,_ro9s are un singur parametru care reprezint
identificatorul de acces al unei conexiuni spre un server MySQL i returneaz un numr ntreg,
care reprezint numrul de nregistrri actualizate la ultima interogare a bazei de date.
Funcia mysql_fetch_array
Aceast funcie transform o nregistrare dintr-un rezultat primit de la server-ul MySQL ntr-o
list. Funcia $3sDl_&et%h_arra3 colecteaz datele referitoare la nregistrarea curent i le
returneaz sub forma unei liste ale crui elemente pot fi accesate folosind numele cmpurilor,
numrul lor de ordine sau folosind ambele moduri. Dac nu mai sunt nregistrri de prelucrat,
funcia returneaz valoarea logic FALSE. Aceast funcie are doi parametri:
- primul parametru este de tipul resurs, a crui valoare a fost setat folosind una dintre
funciile $3sDl_D*er3 sau $3sDl_*nb*&&ere,_D*er3;
- al doilea parametru este opional, este de tip ntreg i reprezint modul n care sa face
transformarea.
Cel de-al doilea parametru poate avea una din valorile urmtoare:
- 'XS_L_ASSO: - elementele din lista rezultat pot fi accesate folosind doar numele
cmpurilor;
- 'XS_L_N5' - elementele din lista rezultat pot fi accesate folosind doar numerele de ordine
ale cmpurilor;
- 'XS_L_2OTH - elementele din lista rezultat pot fi accesate folosind ambele moduri
prezentate anterior;
Funcia mysql_fetch_assoc
Aceast funcie transform o nregistrare dintr-un rezultat primit de la server-ul MySQL ntr-o
list i are acelai efect cu cel al folosirii funciei $3sDl_&et%h_arra3, folosind pentru cel de-al
doilea parametru valoare 'XS_L_ASSO:.
Funcia mysql_fetch_num
Aceast funcie transform o nregistrare dintr-un rezultat primit de la server-ul MySQL ntr-o
list i are acelai efect cu cel al folosirii funciei $3sDl_&et%h_arra3, folosind pentru cel de-al
doilea parametru valoarea 'XS_L_N5'.
Funcia mysql_stat
Aceast funcie returneaz un ir de caractere care reprezint statusul server-ului MySQL i
are un singur parametru care reprezint identificatorul de acces la o conexiune ctre un server
MySQL.
Cod:
<?php
$conectare = mysql_connect("localhost", "user", "parola") or die("Nu se
poate conecta la server");
$stare = explode(' ', mysql_stat($conectare));
print_r($stare);
mysql_close($conectare);
?>
Utilizarea irurilor
Secvene escape
Pentru a include caractere speciale n cadrul irurilor trebuie s folosii anumite secvene
es%ape. n tabelul de mai jos este prezentat setul de secvene es%ape folosit n PHP.
Secvena es%ape Semnificaie
\n salt la linie nou
\r retur de car
\t caracter de tabulare pe orizontal
\\ backslah
\$ simbolul dolarului
\" ghilimele duble
\xxx
caracterul asociat valorii ASCII xxx, exprimat sub forma unui numr n
octal
\xnn
caracterul asociat valorii ASCII xxx, exprimat sub forma unui numr n
hexazecimal
n afar de ultimile dou secvene din tabelul de mai sus, celelalte au fost prezentate n
articolul Cteva informaii despre documentarea i depanarea unui script. Fiecare dintre aceste
secvene es%ape folosete un cod ASCII (American Standard Code for Information
Interchange) pentru reprezentarea unui caracter. Codurile ASCII sunt valori ntregi, care sunt
cuprinse ntre 0 i 255; fiecare liter sau simbol folosit frecvent n limbile vest-europene are
asociat un cod ASCII. De exemplu, codul ASCII asociat literei A este 65, iar codul asociat cifrei
1 este 49.
Pentru Z### puteti folosi reprezentarea n octal (baza 8) a unui cod ASCII pentru specificarea
caracterului corespunztor. De exemplu, valoarea zecimal 65 (care este codul ASCII al literei
A) poate fi reprezentat n octal sub forma 101. Ca atare, puteti reprezenta litera A folosind
secvena es%ape "\101".
Pentru Z#nn putei folosi reprezentarea n hexazecimal (n baza 16). Pentru valoarea zecimal
65 poate fi reprezentat n hexazecimal cu nr 41. Deci putei scrie "\41".
Utilizarea codurilor ASCII
n tabelul de mai jos sunt prezentate cteva funcii PHP folosite la utilizarea codurilor ASCII.
Iat un scurt exemplu de utilizare a funciei or,/0 pentru a determina codul ASCII
corespunztor unui anumit caracter:
$%ara%ter=>A>E
$n*$ar=or,/$%ara%ter0E
e%ho >SbrNValoarea AS:-- a %ara%ter*l*i >.$%ara%ter.> este >.$n*$arE
Datele de ieire ale acestui exemplu sunt:
Valoarea AS:-- a %ara%ter*l*i A este LJ
Funcie Descriere
chr(n) Returneaz caracterul avnd codul ASCII dat de n.
dechex(n)
Returneaz valoarea hexazecimal echivalent cu valoarea zecimal dat de
n.
decoct(n) Returneaz valoarea n octal echivalent cu valoarea zecimal dat de n.
hexdec(n)
Returneaz valoarea zecimal echivalent cu valoarea hexazecimal dat de
n.
octdec(n) Returneaz valoarea zecimal echivalent cu valoarea n octal dat de n.
ord(c) Returneaz codul ASCII echivalent caracterului c.
n continuare este un exemplu care afieaz echivalenele n zecimal, octal, respectiv
hexazecimal al caracterelor ASCII ale cror coduri sunt cuprinse ntre 32 i 127:
Cod:
<?php
for ($i=32; $i<128; $i++)
{
$c=chr($i);
$octal=decoct($i);
$hex=dechex($i);
echo "<br>Nr. zecimal= $i - octal= $octal - hexa=$hex - caracter ec
hivalent=$c";
}
?>
Pentru caracterul cu nr 32 caracterul echivalent este un spaiu.
irurile delimitate ntre ghilimele simple
Dac dorii, putei scrie un ir ntre ghilimele simple, nu neaprat duble. Un motiv n acest
sens l constituie facilitatea posibilitii de includere a ghilimelelor duble. Exemplu:
e%ho >Si$g sr%=Z>pi#el.phpZ> alt=Z>Z> height=Z><Z> 9i,th=Z><Z>N>E
Acest ir poate fi scris i astfel:
e%ho 'Si$g sr%=>pi#el.php> alt=>> height=><> 9i,th=><>N'E
irurile delimitate ntre ghilimele simple se comport ntr-un mod diferit fa de irurile
delimitate prin ghilimele duble:
- Singurele secvene es%ape permise n cadrul irurilor delimitate prin ghilimele simple sunt \\
i \'.
- Nu se execut substituia variabilelor atunci cnd datele de ieire sunt reprezentate printr-un
ir delimitat prin ghilimele simple. n consecin dac folosii ghilimele simple ca n exemplul
urmtor:
$# = >test>E
e%ho '# este $#'E
datele de ieire vor arta aa:
# este $#.
Pentru a evita astfel de situai preferabil e s folosii ghilimele duble sau afiarea valorilor din
variabile n afara ghilimelelor simple, ca n exemplul urmtor:
$# = >test>E
e%ho '# este '.$#E
Crearea datelor de ieire formatate
PHP include dou funcii utile pentru generarea datelor de ieire formatate, n spe print&/0i
sprint&/0. Funcia print&/0 afieaz datele sale de ieire, n timp ce funcia sprint/0 returneaz
datele sale de ieire sub forma unor valori ir. n general, fiecare funcie preia dou sau mai
multe argumente. Primul argument este un ir, denumit Tir ,e &or$atare, care specific
formatul datelor de ieire, iar celelalte argumente specific valorile care vor constitui datele de
ieire. Iat un exemplu simplu de utilizare a funciei print&/0:
print&/>Valoarea l*i n este! `,>. $n0E
$re;*ltat = sprint&/Valori! `,. `&>. $n. $#0E
irul de formatare const dintr-o serie de caractere i directive ordinare. Un caracter ordinar
este orice caracter, n afara caracterului %. Caracterele ordinare sunt pur i simplu copiate la
ieire. Directivele reprezint secvene de caractere care ncep cu simbolul % acestea
determin modul n care va fi formatat argumentul corespunztor. O directiv simpl, cum
este cea din exemplul precedent, poate consta dintr-un caracter % urmat de un specificator de
tip, precum ,, care arat c argumentul trebuie tratat ca numr zecimal. Cu toate acestea, o
directiv mai sofisticat poate include urmtoarele componente, care trebuie s apar n
ordinea indicat:
- Specificator de completare (opional): Un specificator de completare precizeaz caracterul
care se va folosi pentru a completa rezultatul pn la dimensiunea cerut a irului. n cazul n
care caracterul de completare este omis, rezultatul este completat cu spaii. Specificatorul de
completare poate fi un caracter spaiu sau un 0 (zero). Un specificator de completare de tip
spaiu este folosit frecvent cu irurile, iar un specificator de completare zero se folosete mai
ales alturi de numere. Un alt caracter de completare poate fi specificat prin prefixarea
acestuia cu un singur semn ('). De exemplu, pentru a completa un rezultat cu liniue de
subliniere, specificai '_ drept caracter de completare.
- Specificator de aliniere (opional): Un specificator de aliniere indic dac rezultatul trebuie s
fie aliniat la stnga sau la dreapta. Dac specificatorul de aliniere este omis, rezultatul va fi
aliniat la dreapta; dac se indic o cratim (-) drept specificator de aliniere, rezultatul va fi
aliniat la stnga.
- Specificator de lime (opional): este un ntreg care determin numrul minim de caractere
ale rezultatului; sau, dac argumentul este de tip ,o*ble, numrul minim de caractere situate
la stnga punctului zecimal. Dac rezultatul conine un numr mai redus de caractere, atunci
va conine i caractere de completare.
- Specificator de precizie (opional): este un punct zecimal, urmat de un ntreg care determin
numrul de cifre dup punctul zecimal pe care trebuie sa le conina rezultatul. Specificatorul
de precizie nu are nici un efect pentru alte tipuri dect double.
- Specificatorul de tip (obligatoriu): Specificatorul de tip determin modul de tratare i afiare
a argumentului. Tabelul de mai jos rezum specificatorii de tip disponibili.
Specificator de tip Descriere
b Trateaz argumentul ca pe un ntreg i l afieaz ca valoare binar.
c
Trateaz argumentul ca pe un ntreg i afieaz caracterul cu aceeai
valoare ASCII ca i argumentul.
d Trateaz argumentul ca pe un ntreg i l afieaz ca valoare zecimal.
f
Trateaz argumentul ca pe o valoare de tip double i l afieaz ca valoare
cu virgul mobil.
o
Trateaz argumentul ca pe un ntreg i l afieaz ca pe o valoare scris n
octal.
s Trateaz argumentul ca pe un ir i l afieaz.
x
Trateaz argumentul ca pe un ntreg i l afieaz ca numr hexazecimal, cu
litere scrise cu minuscule.
X
Trateaz argumentul ca pe un ntreg i l afieaz ca numr hexazecimal, cu
litere scrise cu majuscule..
Dac dorii s inserai simbolul procentului n datele de ieire ale unui apel la funcia print&/0
sau sprint&/0, inserai dou caractere % n locul dorit. La apariia a dou caractere %, funciile
print&/0 i sprint&/0 tiu c dorii s inserai un simbol al procentului, nu o directiv de
formatare. Tabelul de mai jos prezint rezultatele aplicrii a diferite iruri de formatare
valorilor selectate. Remarcai c, n cazul omiterii cifrelor zecimale, se produce automat o
rotunjire. n tabelul de mai jos spaiile au fost nlocuite prin caracterul ^, pentru a vedea mai
bine amplasarea acestora.
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
Dac preferai, putei folosi funcia n*$ber_&or$at/0, care returneaz o valoare de tip ir
coninnd un rezultat formatat. Putei apela funcia cu unul, dou sau patru argumente:
n*$ber_&or$at/n*$ar0
n*$ber_&or$at/n*$ar. ;e%i$ale0
n*$ber_&or$at/n*$ar. ;e%i$ale. p*n%t_;e%i$al. separator_$ii0
Argumentul n*$ar specific valoarea numeric pe care dorii s o formatai. Argumentul
;e%i$ale specific numrul dorit de cifre zecimale. Argumentul p*n%t_;e%i$al precizeaz
caracterul ce se va folosi drept punct zecimal, iar argumentul separator_$ii precizeaz
caracterul care se va folosi ca separator al miilor. n mod prestabilit, rezultatul este formatat
fr zecimale, este inserat un punct naintea cifrelor care compun partea zecimal, respectiv
se foloeste o virgul pentru separarea miilor. Exemplu:
n*$ber_&or$at/<.=BO. =0
returneaz valoarea 1.23
Manipularea irurilor i scrierea expresiilor regulate
PHP conine peste 70 de funcii care lucreaz cu iruri. Aceast pagin descrie cele mai
utilizate funcii. Aceste funcii v permit s obinei lungimea unui ir, s eliminai dintr-un ir
caracterele de tip spaiu i s convertii caracterele unui ir n majuscule sau minuscule.
Obinerea lungimii unui ir
Funcia strlen/0 returneaz lungimea irului specificat ca argument al funciei. Iat un
exemplu:
$sir=>%eCa %ara%tere>E
$n*$ar=strlen/$sir0E
e%ho >SbrNL*ngi$ea sir*l*i este ,e $n*$ar %ara%tere>E
Eliminarea caracterelor dintr-un ir
Numeroase funcii PHP v permit s eliminai caracterele de tip spaiu alb de la una sau
ambele extremiti ale unui ir. Caracterele de tip spaiu alb sunt caractere precum spaiu,
tabulator i caracter de salt la linie nou, care nu dispun de nici o reprezentare vizibil. Aceste
funci sunt prezentate n tabelul de mai jos.
Funcie Descriere
chop(s)
Returneaz valoarea lui s, eliminnd spaiile albe de la extremitatea din
dreapta a irului. Similar cu rtrim().
ltrim(s)
Returneaz valoarea lui s, eliminnd spaiile albe de la extremitatea din
stnga a irului.
rtrim(s)
Returneaz valoarea lui s, eliminnd spaiile albe de la extremitatea din
dreapta a irului. Similar cu chop().
trim(s) Returneaz valoarea lui s, eliminnd spaiile albe de la ambele extremiti.
Conversia irurilor la majuscule sau minuscule
Funcia strto*pper/0 returneaz valoarea argumentului su, convertit la majuscule. Funcia
conexa strtolo9er/0 returneaz valoarea argumentului su, convertit la minuscule.
Compararea irurilor i cutarea n iruri
PHP furnizeaz patru funcii care sunt deosebit de utile pentru compararea irurilor. Aceste
funcii sunt enumerate mai jos. Fiecare funcie returneaz o valoare al crei semn determin
rezultatul comparaiei. Funcia strn%ase%$p/0 a fost adugat n versiunea PHP 4.0.2.
Funcie Descriere
strcasecmp(s1, s2)
Execut o comparaie fr sensibilitate la diferena ntre majuscule i
minuscule. Returneaz o valoare mai mic dect zero dac s1 este mai mic
dect s2, o valoare mai mare dect zero dac s1 este mai mare dect s2,
respectiv 0 n celelalte cazuri.
strcmp(s1, s2)
Execut o comparaie cu sensibilitate la diferena ntre majuscule i
minuscule. Returneaz o valoare mai mic dect zero dac s1 este mai mic
dect s2, o valoare mai mare dect zero dac s1 este mai mare dect s2,
respectiv 0 n celelalte cazuri.
strncasecmp(s1,
s2, n)
La fel ca strcasecmp() doar c la comparaie sunt luate n considerare un
numr de n caractere.
strncmp(s1, s2, n)
La fel ca strcmp() doar c la comparaie sunt luate n considerare un numr
de n caractere.
Descoperirea i extragerea sub-irurilor
PHP include numeroase funcii care gsesc i extrag sub-iruri, adic pri dintr-un ir. Cele
mai importante funcii de acest gen sunt rezumate mai jos:
Funcie Descriere
strchr(s1, s2)
Returneaz toate irurile s1 de la prima apariie a irului s2 i pn la
sfrit. Dac s1 nu este gsit, funcia returneaz FALSE. Funcia strstr()
execut aceeai operaie.
stristr(s1, s2)
Returneaz toate irurile s1 de la prima apariie a irului s2 i pn la
sfrit. Dac s1 nu este gsit, funcia returneaz FALSE. irurile s1 i s2
sunt comparate fr a se ine cont dac literele sunt majuscule sau
minuscule.
strpos(s1, s2)
Returneaz poziia ntreag a primei apariii a irului s2 n s1. Dac s2 nu
este gsit, funcia returneaz FALSE.
strrchr(s1, s2)
Returneaz toate irurile s1 de la ultima apariie a irului s2 i pn la
sfrit. Dac s1 nu este gsit, funcia returneaz FALSE. La comparaie este
folosit numai primul caracter al irului s2.
strstr(s1, s2)
Returneaz toate irurile s1 de la prima apariie a irului s2 i pn la
sfrit. Dac s1 nu este gsit, funcia returneaz FALSE. Funcia strchr()
execut aceeai operaie.
substr(s, start) Returneaz poriunea irului s specificat de indexul ntreg start,
substr(s, start,
lung)
respectiv de indexurile start i lung. Prima poziie a irului este poziia 0.
Mai jos este dat un exemplu care folosete funciile de mai sus:
Cod:
<?php
$s = "de la deal la vale si iar inapoi la vale mergand spre deal";
$b = "al";
$n = strpos($s, $b);
echo "<br>strpos(\"$s\", \"$b\"): $n";
$n = strchr($s, $b);
echo "<br>strchr(\"$s\", \"$b\"): $n";
$n = strrchr($s, $b);
echo "<br>strrchr(\"$s\", \"$b\"): $n";
$rezultat = substr($s, 6, 4);
echo "<br>substr(\"$s\", 6, 4): $rezultat";
?>
O potenial dificultate n utilizarea funciei strpos/0 const n aceea c poate fi greu de sesizat
diferena dintre valoarea returnat 0, care arat c sub-irul a fost gsit n poziia iniiala a
irului, i valoarea returnat FALSE, care arat c sub-irul nu a fost gsit. Mai jos este un
scurt exemplu care indic un mod adecvat de testare a valorii returnate de funcia strpos/0,
astfel nct s se poat face diferena ntre cele dou rezultate:
$po; = strpos/s<. s=0E
i& /$po; === FALSE0
H
"" s*bRsir*l n* a &ost gasit...
I
Procedeul prezentat folosete operatorul de identitate (===) pentru a determina dac
valoarea returnat este identic (nu doar aritmetic egal) cu valoarea FALSE. Dac folosii n
schimb operatorul de egalitate (==), este posibil ca rezultatul s fie incorect; FALSE are
valoarea numeric 0, valoare returnat i dac sub-irul este gsit n poziia initial a irului.
Acest procedeu presupune utilizarea versiunii PHP 4.0b3 sau a unei versiuni ulterioare; n
versiunile anterioare ale limbajului PHP, funcia strpos/0 returna o valoare ir.
nlocuirea unui sub-ir
O operaie frecvent folosit n programare const n gsirea unui sub-ir i nlocuirea sa cu o
valoare nou. PHP are dou funcii deosebit de utile pentru asemenea operaii, i anume
str_repla%e/0i s*bstr_repla%e/0.
Funcie Descriere
str_replace(cauta,
inlocuire, subiect)
Se caut n irul s*bie%t sub-irul %a*ta; dac sub-irul este gsit,
returneaz valoarea s*bie%t, nlocuindu-se prima apariie a irului %a*ta
cu inlo%*ire.
substr_replace(subiect,
inlocuire, start,
lungime)
Returneaz valoarea s*bie%t, nlocuind sub-irul care ncepe de la start
i avnd lungimea l*ngi$e cu irul inlo%*ire.
Remarcai c funcia str_repla%e/0 noteaz sub-irul prin valoarea sa, n timp ce funcia
s*bstr_repla%e/0 noteaza sub-irul prin pozitia sa n interiorul irului subiect. Mai jos avei un
exemplu de utilizare a acestor funcii:
Cod:
<?php
$subiect = "de la deal la vale si iar inapoi la vale mergand spre deal"
;
$cauta = "deal";
$inlocuire = "DEAL";
$rezultat = str_replace($cauta, $inlocuire, $subiect);
echo "<br>str_replace(\"$cauta\", \"$inlocuire\", \"$subiect\"): $rezul
tat";
$rezultat = substr_replace($subiect, $inlocuire, 6, 4);
echo "<br>substr_replace(\"$subiect\", \"$inlocuire\", 6, 4): $rezultat"
;
?>
Scrierea expresiilor regulate
n articolul Funcii PHP pentru expresii regulate am vorbit despre semnificaia caracterelor care
se afl ntr-un sablon. n continuare o s detaliez mai mult expresiile regulate.
- S presupunem, de exemplu, c dorii s specificai un ir care poate include litera b sau
litera %. Putei face aceasta folosind expresia regulat [b%]. Prin includerea valorilor posibile
ntre paranteze, formai o expresie regulat echivalent cu formularea "alege oricare din
aceste valori".
- S presupunem c dorii s specificai un ir care poate include orice vocal; expresia
regulat [aeio*] v poate fi de ajutor. Dac dorii s permitei i utilizarea majusculelor, putei
scrie [aeio*AE-O5].
- S presupunem c dorii s specificai un ir care poate include orice caracter scris cu
majuscule. Putei scrie [ab%,e&ghi4)l$nopDrst*C9#3;] sau putei folosi forma mai compact
[aR;], unde prin cratim se nelege o serie de caractere consecutive.
- S presupunem c dorii s specificai irurile sat, $at i lat. Pentru aceasta, avei nevoie de
expresia regulat [s$l]at. Semnificaia acestei expresii regulate este urmtoarea: "alege
oricare dintre literele s, $ i l i scrie dup litera respectiv literele at".
- Dac un caracter ^ este primul simbol menionat ntre parantezele drepte, acesta are ca
efect inversarea semnificaiei expresiei regulate plasate ntre paranteze. De exemplu, expresia
regulat [aaR;] corespunde oricrui caracter diferit de un caracter scris cu minuscule.
- Pentru a specifica faptul c o expresie regulat se poate repeta, expresia regulat va fi
urmat de o pereche de paranteze acolade, care includ limitele superioar i inferioar ale
repetiiei. De exemplu, expresia regulat [aero*]{<.O} corespunde unui ir care este compus
din 1-4 vocale.
- Pentru a specifica repetarea mai multor pri ale unei expresii regulate, includei prile
respective ntre paranteze. De exemplu, expresia regulat ([s$l]at){<.=} corespunde unui
numr de una sau dou repetri ale oricruia dintre irurile "sat", "$at" sau "lat".
- Unele valori care se repet sunt att de frecvent folosite, nct au abrevieri:
Abreviere Semnificaie
+ {1,n}, unde n este un numr arbitrar de mare
* {0,n}, unde n este un numr arbitrar de mare
? {0,1}
- S presupunem c dorii s reprezentai o nmulire. Dac folosii caractere minuscule pentru
operanzi, putei obine ceva de genul [aR;]*[aR;]. Totui, aceast expresie regulat nu are
semnificaia dorit, deoarece * este un factor de repetiie, nu un caracter dintr-un ir. Pentru a
dezactiva semnificaia special a caracterului *, trebuie s l prefixai cu un caracter
backslash: [aR;]\*[aR;].
- Pentru a specifica faptul c o expresie regulat corespunde numai unui sub-ir care include
caracterul iniial al unui ir subiect, prefixai expresia regulat cu un caracter ^. De exemplu,
expresia regulat ^[s$l]at corespunde sub-irurilor "sat", "$at" sau "lat" numai dac acestea
apar la nceputul irului subiect.
- Similar, pentru a arta c o expresie regulat corespunde numai unui sub-ir care include
caracterul final al unui ir subiect, anexai la expresia regulat caracterul $. De exemplu,
expresia regulat [s$l]at$ corespunde sirurilor "sat", "$at" sau "lat" numai dac acestea apar
la sfritul irului subiect.
- Expresia regulat ^[s$l]at$ corespunde sub-irurilor "sat", "$at" sau "lat" numai dac irul
subiect este identic cu unul dintre aceste sub-iruri.
Pentru uurina creeri unor expresii regulate putei utiliza i un program de genul Regex Coach
cu care s va facei propria expresie pe care apoi s o folosii n scripturile dvs.
Utilizarea variabilelor cookie
Variabilele cookie sunt utile pentru stocarea preferinelor utilizatorilor i a altor informaii care
trebuie reinute atunci cnd utilizatorul trece la o nou pagin web. Valorile majoritii
variabilelor dispar atunci cnd scriptul PHP care le conine i ncheie execuia. Spre deosebire
de acestea, valorile variabilelor cookie se pot pstra un timp indefinit. Browserul utilizatorului
stocheaza variabilele cookie n unitatea de hard-disk local a utilizatorului.
La ce este util o variabil cookie? De exemplu pentru pstrarea preferinelor utilizatorului.
Cnd utilizatorul revine la pagina vizitat, variabilele cookie permit browserului s recunoasc
utilizatorul i s restaureze opiunile selectate de utilizator. Din pacate, variabilele cookie nu
constituie soluia perfect pentru un mediu de stocare pe termen lung i prezint o serie de
dezavantaje cum ar fi:
- Un utilizator poate dezactiva variabilele cookie prin stabilirea unei opiuni a browserului.
- n anumite situaii, variabilele cookie pot fi vizualizate de ali utilizatori.
- Un site poate stoca numai 20 de variabile cookie i numai 4 KB de informaii n unitatea de
hdd local a utilizatorului.
- Numeroase versiuni ale browserelor frecvent folosite au erori care le mpiedic sa foloseasc
variabilele cookie n mod adecvat.
n ciuda acestor dezavantaje, variabilele cookie rmn cea mai populara tehnic pentru
obinerea unui mediu de stocare pe termen lung.
Accesul la o variabil cookie
Dac ai creat o variabil cookie, valoarea acesteia este automat pus la dispoziie ca variabil
PHP avnd acelai nume cu acela al variabilei cookie. De exemplu, s presupunem c ai creat
o variabil cookie denumit "anoti$p" i c i atribuii valoarea "Cara". Aceast pereche nume-
valoare este apoi pus la dispoziia fiecrui script PHP asociat paginilor dvs de web. Deci putei
afia valoarea variabilei cookie folosind urmtoarea instruciune:
e%ho >Valoarea Cariabilei %oo)ie este $anoti$p>E
Aceast comand va afia:
Valoarea Cariabilei %oo)ie este Cara
Variabila PHP de tip tablou asociativ HTTP_:OO[-E_VARS conine numele i valoarea fiecrei
variabile cookie curent. Dac dorii s vizualizai fiecare variabil cookie disponibil i
valoarea acesteia, putei invoca funcia phpin&o/0, care afieaz valoarea tabloului
HTTP_:OO[-E_VARS. De asemenea putei folosi i urmtorul script pentru a afia toate
numele i valorile variabilelor cookies:
&orea%h /$HTTP_:OO[-E_VARS as $n*$e =N $Caloare0
e%ho >SbrN$n*$e =N $Caloare>E
Crearea unei variabile cookie
Pentru a crea o variabil cookie, trebuie invocat funcia set%oo)ie/0, care are urmtoarea
sintax:
set%oo)ie/n*$e. Caloare. e#pirare0
Argumentul n*$e specific numele variabilei cookie, iar argumentul Caloare specific valoarea
variabilei. Argumentul e#pirare indic momentul expirrii variabilei cookie; dup ora
specificat, variabila cookie nu mai este accesibil. n general, este convenabil s se specifice
momentul expirrii folosind funcia ti$e/0, care returneaz intervalul de timp (exprimat n
secunde) scurs de la 1 ianuarie 1970. Putei aduga o valoare de tip decalaj (offset), care
specific intervalul de timp pe durata cruia variabila cookie trebuie s fie accesibil. De
exemplu:
set%oo)ie />anoti$p>. >Cara>. ti$e/0@BLQQ0E
Aceast instruciune creeaz o variabil cookie denumit "anoti$p", care are valoarea "Cara".
Variabila cookie va fi disponibil timp de o ora (3600 secunde) de la crearea sa. Dac
preferai, putei specifica momentul expirrii folosind funcia $)ti$e/0. Aceast funcie are
urmtoarea form:
$)ti$e /ore. $in*te. se%*n,e. l*na. ;i. an0
De exemplu urmtoarea inscruciune creeaz o variabil cookie care expir la o secund dup
miezul nopii primei zile a anului 2008:
set%oo)ie/>anoti$p>. >Cara>. $)ti$e/Q.Q.<.<.<.=QQM00E
1tenieHHH
Valorile variabilelor cookie sunt trimise de ctre browser ca parte a antetelor HTTP. Ca atare,
valorile variabilelor cookie trebuie s fie stabilite anterior expedierii oricror altor valori ctre
browser. Trimiterea chiar i a unui singur spaiu v poate mpiedica s configurai valoarea
unei variabile cookie. Pentru a evita problemele, asigurai-v c un script PHP care stabilete o
valoare a unei variabile cookie este plasat la nceputul fiierului, nainte de a trimite alte taguri
html sau alte caractere ctre browser. De asemenea, stabilii valoarea variabilei cookie nainte
de a executa o instruciunie echo sau alt instruciune PHP care trimite browserului date de
ieire. Aceste reguli se aplic la fel i la crearea sesiunilor despre care am discutat n articolele
de pe acest site.
tergerea unei variabile cookie
Deoarece o variabil cookie are o dat de expirare, aceasta va fi tears automat la un
oarecare interval de timp dup crearea sa. Totui, putei terge o variabil cookie imediat.
Pentru aceasta, fixai momentul expirrii variabilei cookie la un moment de timp din trecut.
Exemplu:
set%oo)ie/>anoti$p>. >>. ti$e/0RBLQQ0E
Aceast instruciune stabilete timpul de expirare cu o or (3600 de secunde) n urm.
Remarcai c valoarea variabilei cookie este exprimat sub forma unui ir vid; din moment ce
variabila cookie nu va mai fi disponibil, valoarea sa nu mai are importan.
Stocarea mai multor valori ntr-o variabil cookie
Deoarece un site web poate stoca numai 20 de variabile cookie n sistemul unui utilizator,
capacitatea de a stoca mai multe valori ntr-o singur variabil cookie este util. Pentru
aceasta, inserai valorile ntr-un tablou i folosii funcia seriali;e/0 pentru a "mpacheta"
elementele tabloului ntr-un ir; ulterior, putei recupera valoarea tabloului folosind funcia
*nseriali;e/0. Mai jos avei un exemplu:
Cod:
<?php
// se creeaza un tablou
for ($i = 0; $i < 30; $i++)
{
$tablou[$i] = $i;
}
// se impacheteaza intregul tablou intr-un sir
$s = serialize($tablou);
// se creeaza o variabila cookie
setcookie("cookies", $s);
if (isset($cookies))
{
// se despacheteaza valoarea variabilei cookie
$rezultat = unserialize(stripslashes($cookies));
// afiseaza elementele tabloului din variabila cookie
foreach ($rezultat as $i => $cookie)
{
echo "<br>$i => $cookie";
}
}
?>
Acest procedeu reuete s ocoleasc limita celor 20 de variabile cookie dar nu poate depi
limita celor 4 KB de date stocate ntr-o variabil cookie pentru fiecare site web n parte.
Specificarea accesului la o variabil cookie
Funcia set%oo)ie/0 poate prelua maximum ase argumente, inclusiv trei argumente despre
care nu am discutat nc. Iat formatul complet al funciei set%oo)ie/0:
set%oo)ie/n*$e. Caloare. e#pirare. %ale. ,o$eni*. sig*r0
n afar de argumentele n*$e, Caloare, e#pirare pe care le-am descris n acest articol, mai
este i argumentul %ale care v permite s specificai calea URL asociat variabilei cookie. n
mod prestabilit, variabila cookie este disponibil pentru scripturile din directorul care conine
scriptul n care a fost configurat variabila respectiv, precum i pentru scripturile din sub-
directoarele aferente directorului respectiv. n particular, scripturilor din directoarele printe
ale directorului care conine scriptul nu li se permite accesul prestabilit la variabila cookie.
Pentru a pune variabila cookie la dispoziia scripturilor dintr-un anumit director i din sub-
directoarele sale, specificai o valoare a argumentului %ale. De exemplu, pentru a pune
variabila cookie la dispoziia ntregului arbore de directoare, specificai "/" ca valoare a
argumentului %ale; pentru a face variabila cookie disponibil n directorul /test i n sub-
directoarele sale, specificai "/test/" ca valoare a argumentului %ale. O complicaie n utilizarea
argumentului %ale o constituie modalitatea de identificare a numelor directoarelor. Specificnd
"/test/" ca valoare a argumentului %ale, variabila cookie va deveni disponibil n /test1, /test2
i n toate directoarele cu nume similare, pe lng directorul /test i sub-directoarele sale.
Dac nu este specificat nici un argument ,o$eni*, o variabil cookie este disponibil numai
pentru scripturile rezidente pe serverul web care a creat variabila respectiv. Argumentul
,o$eni* v permite s specificai numele de domeniu asociat unei variabile cookie. n
consecina, variabila cookie va fi disponibil numai pentru paginile web din cadrul domeniului
specificat.
De exemplu, s presupunem c un script din serverul web
http!""999.s*b,o$eni*.,o$eni*.%o$ creeaz o variabil cookie. n mod prestabilit, variabila
cookie este disponibil numai pentru gazda respectiv. Cu toate acestea, putei face variabila
cookie disponibil pe ntreg domeniu s*b,o$eni*.,o$eni*.%o$, specificnd
"s*b,o$eni*.,o$eni*.%o$" ca valoare a argumentului ,o$eni*. Specificaia Netscape pentru
variabile cookie (http://wp.netscape.com/newsref/std/cookie_spec.html) impune ca
argumentul ,o$eni* s conin minimum dou caractere punct. Ca atare, nu trebuie s
specificai un ir de tipul ",o$eni*.%o$" ca valoare a argumentului ,o$eni*.
Argumentul sig*r este o valoare ntreag, care specific dac o variabil cookie trebuie trimis
prin intermediul unei conexiuni sigure (HTTPS). Specificai valoarea 1 pentru a mpiedica
transmiterea variabilei cookie n cazul n care conexiunea nu este sigur; pentru a permite
transmiterea variabilei cookie prin conexiuni HTTP obinuite, specificai valoarea 0.
Deoarece browserele stocheaz variabilele cookie n unitatea de hdd local, utilizatorii unui
sistem pot obine accesul la fiierele cookie i pot citi sau chiar modifica informaiile coninute
n fiierele respective. O modalitate de a preveni situaia prezentat const n criptarea datelor
stocate n variabilele cookie. Pentru aceasta, putei folosi funciile '%r3pt din PHP. Funciile n
cauz sunt incluse n biblioteca lib$%r3pt, care nu face parte din versiunea instalat n mod
prestabilit a limbajului PHP.
Dei argumentele e#pirarei %ale ale funciei set%oo)ie/0 sunt opionale, unele versiuni ale
principalelor browsere prezint erori care le determin s refuze variabilele cookie dac aceste
argumente nu sunt specificate. Ca atare, n general este recomandat s specificai aceste
argumente.
Ceniune:
nainte de a trimite date HTML unui browser, un server web trimite, n general, unul sau mai
multe antete HTTP; aceste antete sunt cunoscute sub numele de antete de rspuns al
serverului. Similar, nainte de a trimite informaii unui server web, un browser web trimite, n
general, unul sau mai multe antete HTTP; aceste antete sunt cunoscute sub numele de antete
de cerere. Antetele de rspuns ale serverului frecvent folosite descriu configuraia serverului i
furnizeaz informaii referitoare la adresa URL solicitat de client. Antetele de cerere utilizate
de obicei descriu configuraia clientului i formatele de date acceptabile de ctre client. n
afar de antetele de rspuns ale serverului i de antetele de cerere, protocolul HTTP folosete
antete generale i antete de entitate. Antetele generale sunt folosite att de ctre clieni, ct
i de ctre servere, pentru a specifica informaii precum data curent i opiunile de
conexiune. Antetele de entitate descriu formatul datelor schimbate de un client i un server.
Expedierea mesajelor de pot electronic
n articolul Transmiterea mesajelor prin e-mail folosind PHP i PEAR am mai discutat depre
funcia $ail/0 i cum se transmite un mesaj cu ajutorul acestei funcii. n acest articol o s
ncerc s aprofundez mai detaliat expedierea i recepionarea mesajelor de e-mail.
Configuraia PHP standard accept expedierea mesajelor de e-mail prin intermediul SMTP
(abreviere de la Simple Mail Transfer Protocol). Acesta este protocolul standard folosit pentru
transferul mesajelor de e-mail de la un sistem la altul prin internet. Mesajele de e-mail sunt
alctuite din dou pri: o serie de antete ,e $esa4 i un %orp. Antetele de mesaj indic
adresa destinatarului i subiectul mesajului, precum i alte informaii. Corpul conine mesajul
n sine. Un exemplu de trimitere a unui mesaj prin intermediul funciei mail:
$ail /,estinatar. s*bie%t. %orp. antete0
unde ,estinatar indic adresa de e-mail a destinatarului, s*bie%t specific antetul de e-mail
care conine subiectul mesajului, %orp este corpul mesajului i antete specific adresele de e-
mail suplimentare, precum antetul &ro$ sau alte antete...
Exemplu:
$ail />a,resa_$ea]serCer.ro>. >'esa4 ,e test>. >:orp*l $esa4*l*i>. >Fro$!
a,resa_$ea]serCer.ro>0E
Putei specifica mai muli destinatari prin separarea fiecrui destinatar de urmtorul prin
intermediul unie virgule:
$ail />a,resa<]serCer<.ro. a,resa=]serCer=.ro. a,resaB]serCerB.ro>. >'esa4 ,e test>.
>:orp*l $esa4*l*i>. >Fro$! a,resa_$ea]serCer.ro>0E
Funcia $ail/0 returneaz TRUE dac serverul SMTP accept mesajul; n caz contrar,
returneaz FALSE. Reinei c acceptarea de ctre serverul SMTP nu garanteaz transmiterea
ctre destinatar a mesajului dvs. Nu exist nici o modalitate 100% sigur de a verifica faptul
c mesajul a fost trimis, aa cum nu exist nici o modalitate absolut sigur de a garanta c
destinatarul a citit mesajul, l-a neles i c a fost de acord cu el.
Unele servere SMTP refuz s accepte adrese i antete care conin spaii albe la sfrit. Pentru
aceasta folosii funcia tri$/0 nainte de a trimite mesajul.
Recepionarea mesajelor de e-mail
Recepionarea mesajelor de e-mail este un proces oarecum mai complex dect expedierea lor.
Dei SMTP face parte din configuraia PHP standard, IMAP (protocolul de recepionare a
mesajelor Interim Mail Access Protocol) nu este o component a acestei configuraii. Dac
administratorul serverului nu a configurat serverul PHP astfel nct s lucreze cu IMAP,
exemplele urmtoare nu vor funiona.
Un server IMAP este accesibil n acelai mod ca i un fiier oarecare. Mai nti, trebuie deschisa
o conexiune cu serverul, apoi se pot trimite cereri serverului i se pot primi rspunsuri de la
acesta. Dup terminarea utilizrii serverului, trebuie nchis conexiunea. Pentru a deschide o
conexiune cu un server IMAP, folosii funcia i$ap_open/0:
i$ap_open /%*tie_postala. i,enti&i%ator_*tili;ator. parola0
Argumentul %*tie_postala specific patru elemente:
- Numele gazdei sau adresa IP a serverului IMAP
- Protocolul care va fi utilizat (IMAP)
- Portul care se va folosi pentru conectarea serverului (n general 143)
- Cutia potal care va fi deschis (n general INBOX)
Argumentul foloseste numeroi delimitatori pentru a separa un element de altul. Iat o valoare
caracteristic a argumentului:
Hlo%alhost"i$ap!<OBI-N2OG
n cadrul acestui exemplu, numele gazdei este lo%alhost; acest lucru este posibil cnd un
server PHP i un server IMAP ruleaz pe acelai sistem gazd. n caz contrar, trebuie s
specificai numele gazdei care ruleaz sistemul IMAP:
H$ail.3ahoo.%o$"i$ap!<OBI-N2OG
Celelalte argumente ale funciei i$ap_open/0, i,enti&i%ator_*tili;ator i parola, specific
identificatorul de utilizator i parola folosite pentru a obine accesul la serverul IMAP. Aa cum
funcia &open/0 returneaz un identificator pe care l putei folosi pentru a obine accesul la un
fiier, la fel i funcia i$ap_open/0 returneaz un identificator pe care l putei folosi pentru a
obine accesul la serverul IMAP. Dac PHP nu poate deschide o conexiune cu serverul IMAP,
funcia i$ap_open/0 returneaza FALSE.
Dac un script se ncheie cu mesajul "Call to undefined function: imap_open", aceasta arat c
PHP nu a fost configurat pentru a folosi IMAP.
Exemplu:
Cod:
<?php
$server = "{mail.as.ro/imap:143}";
$utilizator = "php4";
$parola = "parola";
$identificator = imap_open($server."INBOX", $utilizator, $parola);
if ($identificator === false)
{
echo "Nu se poate deschide cutia poatala";
}
?>
n afar de directorul INBOX standard, IMAP permite unui utilizator s defineasc directoare,
care pot fi folosite pentru stocarea i organizarea mesajelor primite. n orice moment, un
director IMAP - INBOX sau un alt director - este considerat ca fiind directorul curent. Dup ce
ai stabilit o conexiune cu un server IMAP, putei cere serverului s desemneze alt dosar ca
dosar curent:
Cod:
<?php
$server = "{mail.as.ro/imap:143}";
$utilizator = "php4";
$parola = "parola";
$identificator = imap_open($server."INBOX", $utilizator, $parola);
if ($identificator === false)
{
echo "Nu se poate deschide cutia poatala";
}
else
{
// se schimba directorul curent
$prefix = "~/mail/";
$director = $server.$prefix."INBOX"."nume_director";
$schimba = imap_reopen($identificator, $director);
if ($schimba === false)
{
echo "Nu se poate deschide directorul specificat";
}
}
?>
De obicei, numele directoarelor IMAP sunt obinute prin prefixarea numelui dosarului cu
particula "~/mail/" i "INBOX", aa cum am artat n exemplu. Cu toate acestea, un
administrator de sistem poate configura o alt politic de atribuire a numelor.
Dac dorii s afiati directoarele existente n csua de mail putei folosi urmtorul script:
Cod:
<?php
echo "Lista directoarelor";
$directoare = imap_listmailbox($identificator, $server, $prefix, "*");
if ($directoare == false)
{
echo "A aparut o eroare la afisarea directoarelor";
}
else
{
foreach ($directoare as $cheie=>$valoare)
{
echo "\n $cheie=>$valoare";
}
}
?>
Dac dorii s creai un director nou folosii funcia i$ap_%reate$ailbo#/0 astfel:
Cod:
<?php
$director = "diverse";
$director = $server.$prefix."INBOX.".$director;
$creare = imap_createmailbox($identificator, $director);
if ($creare === false)
{
echo "Nu s-a putut crea directorul";
}
?>
Numele unui director IMAP trebuie s conin numai litere, cifre i caractere de subliniere.
Dac dorii s creai un sub-director, putei proceda astfel incluznd un punct n numele
directorului. Punctul se comport ca separator de cale, analog caracterului slash folosit n cile
din cadrul sistemului de fiiere.
Pentru modificarea numelui unui director din csua de email folosii funcia
i$ap_rena$e$ailbo#/0 astfel:
Cod:
<?php
$director_vechi = $server.$prefix."INBOX.".$director_vechi;
$director_nou = $server.$prefix."INBOX.".$director_nou;
$modificare = imap_renamemailbox($identificator, $dosar_vechi, $dosar_n
ou);
if ($modificare === false)
{
echo "A aparut o eroare la modificarea numelui directorului";
}
?>
Pentru tergerea unui director folosii funcia i$ap_,elete$ailbo#/0:
Cod:
<?php
$director = $server.$prefix."INBOX.".$director;
$stergere = imap_deletemailbox($identificator, $director);
if ($stergere === false)
{
echo "A aparut o eroare la stergerea directorului";
}
?>
Spre deosebire de mesajele IMAP care rmn n cutia potal pn cnd le tergei, un
director IMAP ters este eliminat imediat i n mod irevocabil. Fii ateni atunci cnd scriei
programe care terg directoare sau atunci cnd folosii scripturi care conin asemenea
programe.
Dup deschiderea unei conexiuni IMAP, putei obine acces la informaii care descriu cutia
potal curent. De exemplu, pentru a afla cte mesaje sunt n cutia potala se invoc funcia
i$ap_n*$_$sg/0:
i$ap_n*$_$sg/$i,enti&i%ator0
n continuare este o variant prin care putei obine diferite informaii despre coninutul cutiei
potale:
Cod:
<?php
$nr_mesaje = imap_num_msg($identificator);
echo "Cutia postala contine $nr_mesaje mesaje";
$nr_mesaje_recente = imap_num_recent($identificator);
echo "Cutia postala contine $nr_mesaje_recente mesaje recente";
$obiect_cutie_postala = imap_mailboxmsginfo($identificator);
if ($obiect_cutie_postala)
{
$tablou_cutie_postala =&;nbsp;get_object_vars($obiect_cutie_postala
);
foreach ($obiect_cutie_postala as $cheie=>$valoare)
{
echo "\n $cheie: $valoare";
}
}
?>
Rezultatul de ieire al scriptului va fi:
Citat:
0utia postala contine x mesa1e
0utia postala contine y mesa1e recente
2nread& ,
3eleted& ,
4mss& x
Size& dimensiunea in octeti a mesa1elor
3ate& data
3ri#er& imap
5ail.ox& numele cutiei postale
6ecent& y
Se mai poate utiliza i varianta urmtoare:
Cod:
<?php
echo "Afisarea starii cutiei postale";
$obiect_cutie_postala = imap_mailboxmsginfo($identificator);
print_r($obiect_cutie_postala);
?>
Funcia PHP print_r/0 afieaz valoarea unui obiect. Aceast metod este cu mult mai simpl
dect cea folosit anterior, dar formatul datelor de ieire este cu mult mai puin inteligibil.
n continuare este un exemplu care afieaz o list de mesaje din directorul curent:
Cod:
<?php
echo "Antete de mesaje in cutia postala curenta:"
$antete = imap_headers($identificator);
if ($antete == false)
{
echo "A aparut o eroare la afisarea mesajelor";
}
else
{
foreach ($antete as $cheie=>$valoare)
{
echo "\n $valoare";
}
}
?>
Funcia i$ap_hea,ers/0 returneaz un tablou unde fiecare element descrie un mesaj din
directorul curent.
O chestie ciudat a serviciului IMAP const n aceea c fiecare mesaj dintr-un director are att
un numr, ct i un identificator. Numrul reprezint pozia mesajului n directorul respectiv;
aceast valoare se poate modifica la adugarea mesajelor, respectiv la tergerea mesajelor
din dosar. Pe de alt parte, identificatorul unui mesaj nu se modific niciodat. IMAP
furnizeaz funcii care v permit s determinai identificatorul unui mesaj dac este dat
numrul su i invers. Iat funciile descrise mai jos:
i$ap_*i,/$i,enti&i%ator. $n*$ar0
si
i$ap_$sgno/$i,enti&i%ator. $i,0
O limitare a funciei i$ap_hea,ers/0 este aceea c nu separ fiecare caracteristic a mesajului
n cmpuri distincte, astfel nct acestea s fie uor accesibile pentru un script. Funcia de
bibliotec IMAP i$ap_&et%h_oCerCie9/0 returneaz un tablou asociativ care descrie un mesaj.
Iat un exemplu care afieaz informaiile despre mesaje:
Cod:
<?php
$nr_mesaj = 1;
$mesaje = imap_fetch_overview($identificator, $nr_mesaj, 0);
foreach ($mesaje as $mesaj)
{
foreach ($mesaj as $proprietate=>$valoare)
{
echo "\n $proprietate: $valoare";
}
}
?>
Al doilea argument al funciei i$ap_&et%h_oCerCie9/0 v permite s specificai o list sau un
domeniu de mesaje pentru care funcia returneaz vederi de ansamblu. Datele de ieire conin
urmtoarele informaii:
- subiectul mesajului
- numele i adresa de e-mail ale expeditorului
- data la care a fost trimis mesajul
- numrul mesajului
- identificatorul mesajului
- dimensiunea mesajului n octei
- indicatoare care precizeaz dac:
= mesajul este recent
= mesajul a fost citit
= mesajul a primit un rspuns
= mesajul a fost marcat n vederea tergerii
= mesajul este o ciorn
Pentru a obine corpul unui mesaj (care include coninutul efectiv al mesajului) putem utiliza
scriptul de mai jos:
Cod:
<?php
// afisare dupa numar
$numar = imap_msgno($identificator, $id)
$corp = imap_body($identificator, $numar, FT_UID);
echo $corp;
?>
Antetele de mesaj conin informaii importante, care n general nu apar n corpul mesajului,
precum data i subiectul mesajului. Mai jos este dat o variant de afiare a acestor
informaii:
Cod:
<?php
$n = 0;
$numar = 0;
$obiect_antet = imap_header_info($identificator, $numar);
$antete = get_object_vars($obiect_antet);
foreach ($antete as $proprietate=>$valoare)
{
if (!is_array($valoare))
{
echo "\n $proprietate: $valoare";
}
else
{
foreach ($valoare as $sub_valoare)
{
echo "\n $proprietate: ";
$sub_valori = get_object_vars($sub_valoare);
for_each ($sub_valoare as $articol=>$valoare_articol)
{
echo "\n $articol=>$valoare_articol";
}
}
}
}
?>
Obiectul returnat de funcia de biblioteca IMAP i$ap_hea,erin&o/0 include urmtoarele
informaii:
- data expedierii mesajului
- subiectul mesajului
- Identificatorul mesajului la care s-a rspuns prin acest mesaj, dac exist
- indicatoare de mesaj, cum sunt cele returnate de funcia i$ap_&et%h_oCerCie9/0
- numele i adresa de e-mail ale:
= expeditorului
= persoanei care primete rspunsul, dac este specificat
= destinatarilor
= destinatarilor eventualelor copii (cc:)
= destinatarilor eventualelor copii la indigo necunoscute (bcc:), dac informaiile respective
sunt disponibile
Numeroase elemente ale tabloului asociativ au valori de tip tablou. Pentru parcurgerea
iterativ i afiarea valorii acestor elemente se folosete o bucl mbricat.
Pentru aplicai mai puin pretenioase se poate utiliza exemplul urmtor:
Cod:
<?php
$antete = imap_headerinfo($identificator, $numar);
print_r($antete);
?>
Folosind funcia print_r/0 se genereaz date de ieire mai puin inteligibile.
Pentru a terge un mesaj IMAP, mai nti l marcai n vederea tergerii i apoi l eliminai.
Mesajele marcate pentru tergere, dar care nu au fost nc eliminate, sunt numai semnalate
ca terse i sunt n continuare accesibile. Iat un exemplu care v permite s tergei un
mesaj prin specificarea numrului sau a identificatorului mesajului:
Cod:
<?php
$stergere = imap_delete($identificator, $id, FT_UID);
if ($stergere == false)
{
echo "Nu se poate sterge mesajul";
}
?>
Pentru a elimina mesajele terse, testai urmtorul script:
Cod:
<?php
$eliminare = imap_expunge($identificator);
if ($eliminare == false)
{
echo "Nu s-a reusit eliminarea mesajelor";
}
?>
n cazul n care dorii s vedei exact ce eroare a returnat una din funciile bibliotecii IMAP,
putei folosi funcia i$ap_errors/0 astfel:
Cod:
<?php
$erori = imap_errors();
if ($erori)
{
foreach ($erori as $cheie=>$valoare)
{
echo "\n $cheie: valoare";
}
}
?>
Pentru copierea unui mesaj din directorul curent ntr-un alt director se poate folosi funcia
i$ap_$ail_%op3/0 astfel:
Cod:
<?php
$numar = 0;
$director = $prefix."INBOX.".$director;
echo "Se copiaza mesajul $numar in directorul $director";
$nr_mesaje = "".$numar;
$copiere = <;/span>imap_mail_copy($identificator, $nr_mesaje, $director
);
if ($copiere === false)
{
echo "A aparut o eroare la copierea mesajului specificat";
}
?>
Deoarece serverele IMAP nu coopereaza la copierea unui mesaj de la un server la altul, nu
este necesar - sau posibil - s se specifice numele gazdei serverului la copierea mesajelor
IMAP.
Cnd ai terminat de utilizat un server IMAP, trebuie s l nchidei, aa cum nchidei un fiier
atunci cnd ai terminat cu el. Iat cum se poate nchide o conexiune IMAP:
Cod:
<?php
$inchidere = imap_close($identificator);
if ($inchidere === false)
{
echo "Nu se poate inchide cutia postala";
}
?>
Biblioteca IMAP furnizeaz multe alte funcii n afara celor descrise n acest articol. De
exemplu, funciile imap_search() i imap_scanmailbox() v permit s cutai mesaje care
satisfac criteriile specificate. De exemplu, putei cuta mesaje al cror corp conine anumite
texte.
n cazul n care furnizorul de servicii internet dispune de un server POP, nu de un server IMAP,
putei avea acces la cutia potal POP cu ajutorul sistemului PHP, folosind biblioteca IMAP. Pur
i simplu deschidei o conexiune cu serverul POP specificnd o cutie potala POP astfel:
$mbox = imap_open("{localhost/pop3:110}INBOX", $identificator_utilizator, $parola);
Numele gazdei, protocolul i numrul portului sunt asemntoare cu valorile similare folosite
pentru conectarea la un server IMAP. De asemenea, putei folosi biblioteca IMAP pentru a v
conecta la un server de informaii folosind NNTP (Network News Transfer Protocol). Pentru
aceasta, deschidei o conexiune astfel:
$nntp = imap_open("{localhost/nntp:119}comp.test", "", "");
Pentru mai multe informaii putei consulta manualul php de la adresa www.php.net.
Stocarea unor date ierarhice ntr-o baz de date
Fie c vrei s v construii propriul forum, s v publicai mesajele dintr-un `mailing list' pe
propriul site de pe internet sau s v scriei propriile CMS, va veni un moment cnd vei dori
s stocai datele ierarhice ntr-o baz de date. i, dac nu folosii o baz de date cu suport
XML, tabelele nu sunt ierarhice; ele nu sunt dect un fiier plat. Va trebui s gasii un mod de
a traduce ierarhia ntr-un fiier plat.
Stocarea arborilor este o problem obinuit, cu multiple soluii. Exist 2 abordri importante:
modelul listei adiacente i algoritmul parcurgerii arborelui cu preordine modificat.
n acest articol vom explora aceste 2 metode de salvare a datelor ierarhice. Ca exemplu voi
folosi arborele dintr-un magazin alimentar fictiv de pe internet. Acest magazin i sorteaz
alimentele dup categorie, culoare i tip. Arborele arat astfel:
Acest articol conine un numr de exemple de coduri care arat cum se salveaz i se
restabilesc datele. Deoarece folosesc eu nsumi acest limbaj i muli ali oameni l folosesc sau
l cunosc, am ales s scriu exemplele n PHP. Probabil c-l putei traduce uor n limbajul pe
care vi-l dorii.
Metoda recursiv
Prima i cea mai elegant abordare pe care o vom ncerca se numete metoda recursivitii .
Este o abordare elegant pentru c vei avea nevoie de o simpl funcie care s se repete n
arborele dvs. n magazinul nostru de alimente tabelul arat astfel:
Dup cum vedei salvai "printele" fiecrui nod. Putem vedea c "Pear" este un copil al
lui "Green" care este un copil al "Fruit" s.a.m.d. Nodul rdcin, "Food", nu are o valoare
parental. Pentru simplificare, am folosit valoarea "title" pentru a identifica fiecare nod.
Bineneles, ntr-o baz de date real, ar trebui s folosii id-ul numeric al fiecrui nod.
Dai-mi arborele
Acum c am introdus arborele nostru n baza de date, e timpul s scriem o funcie de afiare.
Aceast funcie va trebui s nceap la nodul rdcin - nodul fr nici un printe - i ar trebui
dup aceea s arate toi copiii acelui nod. Pentru fiecare dintre aceti copii, funcia ar trebui s
restabileasc i s arate toate nodurile copii ale acelui copil. Pentru aceti copii, funcia ar
trebui s arate din nou toi copiii s.a.m.d.
Aa dup cum probabil c ai observat, exist un tipar regulat n descrierea acestei funcii.
Putem pur i simplu s scriem o funcie care restabilete copiii unui anumit nod printe. Acea
funcie ar trebui atunci s porneasc o alt instan a ei nsi pentru fiecare dintre aceti
copii, pentru a-i arta pe toi copiii acestora. Acesta este mecanismul recursiv care-i d
metodei numele de " metoda recursivitii".
Cod:
<?php
// $parent este parintele copiilor pe care vrem sa-i vedem
// $level creste cand inaintam in arbore,
// folosit pentru a arata un arbore frumos indentat
function display_children($parent, $level)
{
// restabileste toti copiii $parent
$result = mysql_query('SELECT title FROM tree '.'WHERE parent="'.
$parent.'";');
// arata fiecare copil
while ($row = mysql_fetch_array($result))
{
// indenteaza si arata titlul acestui copil
echo str_repeat(' ',$level).$row['title']."\n";
// foloseste din nou aceasta functie pt a arata
// copiii acestui copil
display_children($row['title'], $level+1);
}
}
?>
Pentru a arta ntregul nostru arbore, vom pune n aplicare funcia cu un "string" gol cum ar
fi $parent i
$row =0; display_children(' ',0);
Pentru arborele magazinului nostru de alimente funcia returneaz:
Citat:
Food
Fruit
6ed
0herry
7ello8
9anana
5eat
9eef
(or/
Observai c, dac vrei s vedei un sub-arbore, putei indica funciei s porneasc cu un alt
nod. De exemplu, pentru a arta sub-arborele "Fruit", ar trebui s punei n aplicare
,ispla3_%hil,ren/'Fr*it'.Q0E
Calea ctre un nod
Cu aproximativ aceeai funcie, putei cuta calea spre un nod, dac tii numele sau id-ul
acelui nod. De exemplu, calea spre "Cherry" este "Food" > "Fruit" > "Red". Pentru a gsi
aceast cale, funcia noastr va trebui s porneasc la cel mai profund nivel : "Cherry". Dup
aceea, ea caut printele acestui nod i-l adaug la cale. n exemplul nostru, acesta ar fi
"Cherry". Dac stim c "Red" este printe pentru "Cherry", putem calcula calea spre "Cherry",
folosind calea spre "Red". Si acest lucru ne este dat de funcia pe care tocmai am folosit-o:
cutnd n mod recursiv prinii, vom gsi calea ctre orice nod din arbore.
Cod:
<?php
// $node este numele nodului a carui cale o dorim
function get_path($node)
{
// cauta parintele acestui nod
$result = mysql_query('SELECT parent FROM tree '.'WHERE title="'.
$node.'";');
$row = mysql_fetch_array($result);
// salveaza calea in aceasta ordine
$path = array();
// continua numai daca acest Snod nu este nodul radacina
// (acesta este nodul fara nici un parinte)
if ($row['parent']!='')
{
// ultima parte a caii spre $nod, este numele
// parintelui lui $node
$path[] = $row['parent'];
// ar trebui sa adaugam calea spre parintele acestui nod
// la cale
$path = array_merge(get_path($row['parent']), $path);
}
// returneaza calea
return $path;
}
?>
Aceast funcie restabilete acum calea ctre un nod dat. Ea restabilete calea ca o dispunere,
ca un array, aa c pentru a arta calea putem folosi
print_r/get_path/':herr3'00E
Dac facei acest lucru pentru "Cherry", vei vedea c:
Citat:
ARRAY
(
[0] => Food
[1] => Fruit
[2] => Red
)
Dezavantaje
Aa cum tocmai am vzut, aceasta este o metod excelent. E uor de neles i codul de care
avem nevoie este de asemenea simplu. Atunci care sunt dezavantajele modelului acestei
structuri de date? n majoritatea limbajelor de programare, este lent i ineficient. Acest
lucru se datoreaz n special recursivitii. Avem nevoie de o interogare n baza de date pentru
fiecare nod din arbore.
Cum fiecare interogare dureaz destul de mult, aceasta face ca funcia s fie foarte lent cnd
se aplic pe arbori mari.
Al doilea motiv pentru care aceast metod nu este att de rapid, este limbajul de
programare pe care probabil l vei folosi. Spre deosebire de limbaje cum ar fi Lisp, cele mai
multe limbaje nu sunt concepute pentru funcii recursive. Pentru fiecare nod, funcia pornete
o alt instan a ei nsi. Aa c, pentru un arbore cu patru nivele, vei pune n aplicare patru
instane ale funciei n acelai timp. i cum fiecare funcie ocup o felie de memorie i are
nevoie de ceva timp pentru a porni, recursivitatea este foarte lent atunci cnd este aplicat
pe arbori mari.
Parcurgerea n preordine modificat a arborelui
Acum, s aruncm o privire asupra unei alte metode de stocare a arborilor. Recursivitatea
poate fi lent, aa c n-ar trebui s folosim o funcie recursiv. Am dori de asemenea s
micorm numrul interogrilor n baza de date. Am prefera s avem o singur
interogare pentru fiecare activitate.
Vom ncepe prin a aeza arborele nostru n poziie orizontal. Pornim de la nodul rdcin
("Food") i scriem 1 n stnga lui. Urmm arborele spre "Fruit" i scriem 2 lng el. n acest
fel, mergem de-a lungul marginilor arborelui n timp ce scriem cte un numr n stnga i n
dreapta fiecrui nod. Ultimul numr este scris n dreapta nodului "Food". n aceast imagine,
putei vedea ntregul arbore numerotat i cteva sgei care arat ordinea numerotrii.
Vom numi aceste numere stngul i dreptul (de exemplu valoarea stng pentru "Food" este
1, valoarea dreapt este 18). Dup cum vedei, aceste numere indic relaia care se stabilete
ntre fiecare dintre aceste noduri. Deoarece "Red" are numerele 3 i 6, el este un descendent
al nodului 1-18 "Food". n acelai fel, putem spune c toate nodurile cu valorile din stanga mai
mari dect 2 i valorile din dreapta mai mici dect 11 sunt descendeni ai nodului 2-11 "Fruit".
Structura arborelui este acum stocat n valorile din stnga i din dreapta. Aceast metod de
a merge de jur mprejurul arborelui i de a numra nodurile se numete algoritmul
"Parcurgerea n preordine modificat a arborelui"
nainte de a continua, s vedem cum arat aceste valori n tabelul nostru:
Dup cum observai, cuvintele "left" i "right" au un neles special n SQL. De aceea, va trebui
s folosim "lft" i "rgt" pentru a identifica coloanele. Observai de asemenea c nu prea mai
avem nevoie de coloana printe . Avem acum valorile "lft" i "rgt" pentru a stoca structura
arborelui.
Extragerea datelor din Arbore
Dac vrei s artai arborele folosind un tabel cu valorile din stnga i din dreapta, va trebui
mai nti s identificai nodurile pe care vrei s le restabilii. De exemplu, dac vrei sub-
arborele "Fruit", va trebui s selectai numai nodurile cu o valoare-stnga cuprins ntre 2 i
11. n SQL, aceasta ar nsemna:
SELE:T \ FRO' tree FHERE l&t 2ETFEEN = AN( <<E
Aceast interogare returneaz:
Ei bine, iat un arbore ntreg ntr-o singur interogare. Pentru a arta acest arbore aa cum
am procedat cu funcia noastr recursiv, va trebui s adugm o clauz OR(ONEAbA (5PA la
aceast interogare. Dac adugai i tergei rnduri din tabelul dvs, probabil c el nu va fi n
ordinea corect. De aceea, ar trebui s ordonm rndurile dup valoarea lor din stnga.
SELE:T \ FRO' tree FHERE l&t 2ETFEEN = AN( << OR(ER 2X l&t AS:E
Ultima problem care ne-a mai rmas este indentarea.
Pentru a arta structura arborelui, copiii ar trebui indentai ceva mai mult dect printele lor.
Putem face aceasta, pstrnd o stiv a valorilor din dreapta. De fiecare dat cnd ncepei cu
copiii unui nod, adugai valoarea din dreapta a acelui nod la stiv. tii c toi copiii acelui
nod au o valoare-dreapta mai mic dect valoarea din dreapta a printelui, aa c, dac o s
comparai valoarea din dreapta a nodului curent cu ultimul nod din dreapta aflat n stiv, o s
putei vedea dac nc mai artai copiii acelui printe. Cnd ai terminat de artat un nod,
ndeprtai valoarea sa din partea dreapt din stiv. Dac vei numra elementele din stiv,
vei obine nivelul nodului curent.
Cod:
<?php
function display_tree($root)
{
// acum, restabileste toti descendentii nodului $root
$result = mysql_query('SELECT lft, rgt FROM tree '.'WHERE title="'.
$root.'";');
$row = mysql_fetch_array($result);
// incepe cu o stiva $right goala
$right = array();
// acum, restabileste toti descendentii nodului $root
$result = mysql_query('SELECT title, lft, rgt FROM tree '.
'WHERE lft BETWEEN '.$row['lft'].' AND '.
$row['rgt'].' ORDER BY lft ASC;');
// arata fiecare rand
while ($row = mysql_fetch_array($result))
{
// verifica stiva numai daca exista una
if (count($right)>0)
{
// verifica daca ar trebui sa indepartam un nod din stiva
while ($right[count($right)-1]<$row['rgt'])
{
array_pop($right);
}
}
// arata titlul nodului indentat
echo str_repeat(' ',count($right)).$row['title']."\n";
// adauga acest nod la stiva
$right[] = $row['rgt'];
}
}
?>
Dac vei folosi acest cod, vei obine exact acelai arbore pe care l-ai obinut cu funcia
recursiv discutat mai sus. Noua noastr funcie va fi probabil mai rapid, nu este recursiv
i folosete doar dou interogri
Calea ctre un nod
Cu acest nou algoritm, va trebui de asemenea s gsim un nou mod de a obine calea ctre un
anumit nod. Pentru a obine aceast cale, vom avea nevoie de o list a tuturor strmoilor
acelui nod.
Cu structura noului nostru tabel, nu este foarte greu. Cnd v uitai, de exemplu, la nodul 4-
5 "Cherry", o s vedei c valorile din stnga ale tuturor strmoilor sunt mai mici dect 4, n
timp ce toate valorile din dreapta sunt mai mari dect 5. Pentru a obine toi strmoii, putem
folosi aceast interogare:
SELE:T title FRO' tree FHERE l&t S O AN( rgt N J OR(ER 2X l&t AS:E
Observai c, ntocmai ca n investigaia noastr precedent, trebuie s folosim clauza
OR(ONEAbA (5PA pentru a sorta nodurile. Aceast interogare va returna:
Citat:
+-------+
| title |
+-------+
| Food |
| Fruit |
| Red |
+-------
Acum nu ne rmne dect s intrm pe fiecare rnd pentru a gsi calea spre "Cherry".
Ci descendeni
Dac mi dai valorile din stnga i din dreapta ale unui nod, v pot spune ci descendeni
are, folosind puin matematic.
Deoarece fiecare descendent incrementeaz valoarea din dreapta a nodului cu 2, numrul
descendenilor poate fi calculat cu:
$descendants = (right - left - 1) / 2
Cu aceast formul simpl, v pot spune c nodul 2-11 "Fruit" are 4 noduri descendeni i c
nodul 8-9 "Banana" este doar un copil, nu un printe.
Automatizarea parcurgerii arborelui
Acum c ai vzut cteva dintre lucrurile uoare pe care le putei face cu acest tabel, e timpul
s nvm cum putem automatiza crearea acestui tabel. Cu toate c este un exerciiu plcut
atunci cnd e fcut prima dat i cu un arbore mic, avem cu adevrat nevoie de un scenariu
care s fac toat aceast numrtoare i nconjur al arborelui pentru noi.
S scriem un scenariu care transform o list adiacent ntr-un tabel traversal al arborelui cu
preordine modificat.
Cod:
<?php
function rebuild_tree($parent, $left)
{
// valoarea din dreapta a acestui nod este valoarea din stanga + 1
$right = $left+1;
// obtine toti copiii acestui nod
$result = mysql_query('SELECT title FROM tree '.'WHERE parent="'.
$parent.'";');
while ($row = mysql_fetch_array($result))
{
// executarea recursiva a acestei functii pt fiecare
// copil al acestui nod
// $right este valoarea dreapta curenta, care este
// incrementata de functia rebuild_tree()
$right = rebuild_tree($row['title'], $right);
}
// am obtinut valoarea din stanga, si acum ca am procesat
// copiii acestui nod stim si valoarea din dreapta
mysql_query('UPDATE tree SET lft='.$left.', rgt='.$right.' WHERE ti
tle="'.$parent.'";');
// returneaza valoarea din dreapta a acestui nod + 1
return $right+1;
}
?>
Aceasta este o funcie recursiv. Ar trebui s-o pornii cu
reb*il,_tree/'FOO('.<0E
atunci funcia restabilete toi copiii nodului "Food".
Dac nu exist copii, ea stabilete valorile din stnga i din dreapta ale acestui nod. Valoarea
din stnga este dat, 1, iar valoarea din dreapta este valoarea din stnga plus 1. Dac exist
copii, aceast funcie se repet i ultima valoare din dreapta este restabilit. Aceast valoare
este folosit atunci ca valoare din dreapta a nodului "Food".
Recursivitatea face ca aceast funcie s fie, prin complexitatea ei, destul de greu de neles.
Totui, ea ajunge la acelai rezultat la care am ajuns noi manual la nceputul acestui capitol.
Ea merge n jurul arborelui, adugnd cte un nod pentru fiecare nod pe care l vede. Dup ce
ai pus n aplicare aceast funcie, vei vedea c valorile din stnga i din dreapta rmn
aceleai (o verificare rapid, valoarea din dreapta a nodului rdcin ar trebui s fie egal
cu de dou ori numrul nodurilor).
Adugarea unui nod
Cum adugm un nod la arbore? Exist dou abordri: putei pstra coloana printe n tabelul
dvs i doar s pornii din nou funcia reb*il,_tree/0 - o funcie simpl dar nu aa de elegant;
sau putei reactualiza valorile din stnga i din dreapta ale tuturor nodurilor n partea dreapt
a fiecrui nod nou.
Prima opiune este simpl. Folosii metoda listei adiacente pentru reactualizare i algoritmul
parcurgerii arborelui cu preordine modificat pentru restabilire. Dac vrei s adugai un nou
nod, adugai-l la tabel i setai coloana printe. Apoi, nu v rmne dect s repornii funcia
reb*il,_tree/0. Aceast opiune este uoar, dar nu foarte eficient cu arbori mari.
Cea de-a doua modalitate de a aduga i terge noduri const n reactualizarea valorilor din
stnga i din dreapta ale tuturor nodurilor n partea dreapt a noului nod. S ne uitm la un
exemplu. Vrem s adugm un nou tip de fruct, o "Strawberry", ca ultim nod i copil al "Red".
Mai nti, va trebui s facem puin loc. Valoarea - dreapta de la "Red" ar trebui schimbat din
6 n 8, iar nodul 7-10 "Yellow" ar trebui schimbat n 9-12 etc. Reactualizarea nodului "Red"
nseamn c va trebui s adugm 2 la toate valorile din stanga i din dreapta mai mari dect
5.
Vom folosi interogarea:
5P(ATE tree SET rgt=rgt@= FHERE rgtNJE
5P(ATE tree SET l&t=l&t@= FHERE l&tNJE
Acum putem aduga un nou nod "Strawberry" pentru a umple noul spaiu. Acest nod are
valoarea - stnga 6 i valoarea - dreapta 7.
-NSERT -NTO tree SET l&t=L. rgt=Y. title='Stra9berr3'E
Dac pornim funcia noastr ,ispla3_tree/0E, vom vedea c noul nostru nod "Strawberry" a
fost introdus cu succes n arbore:
Citat:
Food
Fruit
Red
Cherry
Strawberry
Yellow
Banana
Meat
Beef
Pork
Dezavantaje
n primul rnd, algoritmul parcurgerii arborelui cu preordine modificat pare greu de neles.
Este cu siguran mai greu dect metoda listei adiacente. Totui, odat ce v-ai obinuit cu
proprietile valorilor din stnga i din dreapta, este evident c putei face cu aceast tehnic
aproape tot ce fceai cu metoda listei adiacente i c algoritmul traversal al arborelui cu
preordine modificat este mult mai rapid. Reactualizarea arborelui impune mai multe
investigaii, ceea ce dureaz mai mult, dar restabilirea nodurilor se realizeaz cu o singur
interogare.
Concluzie
Acum v-ai familiarizat cu ambele metode de stocare a arborilor ntr-o baz de date. Dei
prefer oarecum parcurgerea arborelui cu preordine modificat, n cazul dvs. metoda listei
adiacente ar putea fi mai bun. V las s judecai singuri.
Lecturi suplimentare
Mai multe despre Arbori n SQL de specialistul n baze de date Joe Celko:
http://searchdatabase.techtarget.com/tip/1,289483,sid13_gci537290,00.html
Alte dou metode pentru a opera cu datele ierarhice:
http://www.evolt.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/index.html
Xindice, baza de date XLM nativ:
http://xml.apache.org/xindice/
O explicaie a recursivitii:
http://www.strath.ac.uk/IT/Docs/Ccourse/subsection3_9_5.html
Autor articol: De Gijs Van Tulder - 30 aprilie 2003
(Traducere efectuat de Dragos dup articolul original)
PHP 5, Factory
O s ncerc pe parcursul acestui tutorial s explic diferite tehnici introduse n PHP 5 pe care mi
place s le folosesc (sau mi-ar plcea).
Motivul?
Data viitoare cnd am nevoie de ceva asemntor s pot gsi repede i ct de ct documentat
informaiile necesare, innd cont c la un moment dat voi pierde aceste lucruri printr-un col
al hdd-ului.
I. Noiuni
ncerc s respect ct mai exact regulile publicate sub numele de Coding Standards pe pagina
de web PEAR.
Documentaia "inline" a claselor, metodelor i atributelor este foarte folositoare cnd citesc
codul surs al unui fiier scris n urm cu 6 luni.
De obicei folosesc phpDocumentor pentru a genera din codul php documenii n mod
profesional. Am gsit i un tutorial aici.
II. Intro
Primul exemplu prezentat n aceast serie se refer la implementarea conceptului de factory n
php. Acest exemplu nu este complet i nu poate fi considerat un exemplu standard al ideii de
factory.
Pentru a-mi rspunde la ntrebarile "Ce este un Factory?", "La ce m ajut?", "Este folositor?",
"Se merit?" am citit articolul "The Factory Method" de Harry Fuecks.
Am parcurs cu atenie codul postat acolo, i am mai citit i paginile astea ce fac parte din
prezentarea "2002 International PHP Conference: Applied OO PHP: APIs, Design Patterns and
Useful Objects - Chuck Hagenbuch".
Google mi-a mai adus cteva articole interesante.
ntr-un final, m-am hotrt s implementez un exemplu scris n java.
Pentru teste, o s folosesc php CLI i un director numit tra%e_&a%tor3.
III. Interfaa.
Din documentaia prezentat n manual, printr-o interaf putem creea un obiect care specific
metodele pe care o clas trebuie s le implementeze, fr a defini ns comportamentul
acestor metode.
Traducerea interfeei din java n PHP 5 arat cam aa:
Cod:
<?php
/**
* Is the Trace Interface
* It contains common methods for every implementation
* @package test.factory.trace
* @access public
*/
interface Trace
{
/**
* Turn on and off debugging
* @param bool debug
*/
public function setDebug($debug);
/**
* Write out a debug message
* @param string message to debug
*/
public function debug($message);
/**
* write out an error message
* @param string message to debug
*/
public function error($message);
}
?>
fiier pe care l-am salvat cu numele de -Tra%e.php.
Continund exemplu, vom scrie dou implementri, prima, va afia mesajele n consol (sau
pagina web dac se renun la CLI) iar cea dea doua, va scrie mesajele ntr-un fiier text.
IV. StdoutTrace.php
Cod:
<?php
include_once('ITrace.php');
/**
* It display the trace to stdout
*
* @package test.factory.trace
* @access public
*/
class StdoutTrace implements Trace
{
/**
* debug
* @var bool
* @access private
*/
private $debug;
/**
* Sets the debug
* @param bool debug
* @return void
* @access public
*/
public function setDebug($debug)
{
$this->debug = $debug;
}
/**
* It writes a debug message
* only if debug is setted to true
* @param string message
* @return void
* @access public
*/
public function debug($message)
{
if($this->debug)
{
// only print if debug is true
echo date("d-m-Y H:i:s")." DEBUG >>>>".$message."\n";
}
}
/**
* It writes an error message
*
* @param string message
* @return void
* @access public
*/
public function error($message)
{
// always print out errors
echo date("d-m-Y H:i:s")." ERROR >>>>".$message."\n";
}
}
?>
Fiierul l-am salvat cu numele de St,o*tTra%e.php n acelai director.
V. FileTrace.php
Cod:
<?php
include_once('ITrace.php');
/**
* It logs the trace to a file
*
* @todo: implement a custom Exception class
* @package test.factory.trace
* @access public
*/
class FileTrace implements Trace
{
/**
* It`s the file handler
* @var handler
* @access private
*/
private $handler;
/**
* Is the file name
* @var string
* @access private
*/
private $file;
/**
* debug
* @var bool
* @access private
*/
private $debug;
/**
* The construnctor
* it opens the file handler
*
* @param string the file name
* @return void
* @access public
*/
public function __construct($file)
{
// a real FileTrace would need to obtain the filename somewhere
if((!is_file($file)) or (!is_writable($file)))
{
throw new Exception("The file ".$file." is not writable,\n
Or it dosent exist in ".__METHOD__." at ".__LINE__."!\n"
);
}
$this->handler = fopen($file, "a+");
}
/**
* Sets the debug
* @param bool debug
* @return void
* @access public
*/
public function setDebug($debug)
{
$this->debug = $debug;
}
/**
* It writes a debug message
* only if debug is setted to true
* @param string message
* @return void
* @throw Exception
* @access public
*/
public function debug($message)
{
if($this->debug)
{
// only print if debug is true
fwrite($this->handler<;/span>, date("d-m-Y H:i:s")." DEBUG
>>>> ".$message."\n");
}
}
/**
* It writes an error message
*
* @param string message
* @return void
* @throw Exception
* @access public
*/
public function error($message)
{
// always print out errors
fwrite($this->handler, date("d-m-Y H:i:s")." ERROR >>>> ".
$message."\n");
}
/**
* Is the Destructor
* just close the handle
* @access public
* return void
*/
public function __destruct()
{
if($this->handler===true)
{
fclose($this->handler);
}
}
}
?>
Fiierul l-am salvat cu numele de FileTra%e.php n acelai director.
VI. Factory
Cod:
<?php
include_once('FileTrace.php');
include_once('StdoutTrace.php');
/**
* Is the factory
*
* @access public
* @package test.factory.trace
*/
class TraceFactory
{
/**
* It trys to get a trace
*
* @access public
* @return mixed Trace Interface implementation
*/
public static function &getTrace($file='')
{
try
{
return new FileTrace($file);
}
catch (Exception $ex)
{
$t = new StdoutTrace();
$t->error("Could not instantiate FileTrace: " + $ex-
>getMessage());
return $t;
}
}
}
?>
Salvat cu numele de Tra%eFa%tor3.php.
VII. Ceva explicaii
nainte de a merge mai departe, cred c e timpul s explic ce am fcut pn acum. Am
ncercat s implementez n PHP 5 un model de factory preluat dintr-un exemplu dat n java.
n partea I, am scris o interfa ce conine trei metode:
setDebug($debug), care mi va permite s schimb nivelul afiat de trace (debug sau error),
debug($message), o s pot afia un mesaj de debug (bineneles dac am fcut
set(eb*g/tr*e0 n prealabil).
error($message), va afia un mesaj de eroare tot timpul (indiferent de valoarea setat
pentru $,eb*g).
n cea de-a doua parte, la fel ca n exemplul pe care l-am urmat, am implementat interfaa
-Tra%e n dou cazuri, FileTra%e ce mi va permite s log-ez mesajele de eroare/debug ntr-un
fiier text i St,o*tTra%e, ce mi va permite s afiez aceste mesaje n consol (pagina web).
Obligatori*, cele dou noi obiecte vor trebui s implementeze metodele prezentate n interfaa
-Tra%e.
FileTra%e, n exemplul urmat de ctre mine, trebuia s arunce o excepie n constructor. Am
decis c n cazul n care fiierul n care vrem s log-m mesajele nu exist sau nu se poate
scrie n el, s arunc excepia, ns dac totul este n regul, s creez han,ler*l ( :) ):
$thisRNhan,ler = &open/$&ile. >a@>0.
Am decis s deschid fiierul n mod a@ (read/write; place the file pointer at the end of the
file), cu toate c probabil a era destul (nu intenionez s i citesc fiierul). Detalii despre
&open, aici.
n plus fa de exemplul urmat, am scris i un destructor, dar acesta nu era necesar (PHP va
nchide automat dup terminare executarea codului handlerul?), iar condiia:
i&/$thisRNhan,ler===tr*e0
nu cred c i are rostul (poate se ntmpl altceva n $this->handler = fopen($file, "a+") ?).
Am decis, ca n PHP s nlocuiesc atributul:
priCate 4aCa.io.PrintFriter p9
cu $han,ler, i am constatat c n PHP pentru a scrie ceva ntr-un fiier este mai intuitiv i mai
uor de reinut.
Comparaie:
p9 = ne9 4aCa.io.PrintFriter/ ne9 4aCa.io.FileFriter/ >%!Ztra%e.log> 0 0E (nu o s reint foarte
uor linia asta)
cu
$thisRNhan,ler = &open/$&ile. >a@>0E
din constructori, sau cu modalitatea de scriere (de exemplu):
p9.println/ >(E251! > @ $essage 0E
p9.&l*sh/0E /AA0
cu
&9rite/$thisRNhan,ler. ,ate/>,R$RX H!i!s>0 . > (E251 NNNN > . $$essage . >Zn>0E
Dar, asta este deja o alt discuie.
Pentru o mai mare flexibilitate, am decis ca numele fiierului n care s log-m mesajele s fie
pasat n constructor (parc a vrea s mearg i pe linux i pe windows n aceiai manier, nu
folosind un nume de fiier predefinit: c:\trace.log).
Acest lucru, aduce i modificri directe n factory.
n schimb, n St,o*tTra%e lucrurile sunt destul de clare, exact ca n exemplu, cu meniunea c
numele obiectului prezentat n exemplu (SystemTrace), l-am nlocuit cu St,o*tTra%e.
Voi continua cu explicaii pentru Tra%eFa%tor3.
Exact ca n exemplul urmat, am declarat metoda ca fiind static, adugnd n plus parametrul
$&ile, reprezentnd numele fiierului n care voi loga mesajele.
Folosesc un bloc try/catch pentru a intercepta exceptia aruncat de constructorul din
FileTra%e.
Poate c sensul exemplului s-a schimbat n momentul n care am decis s pasez numele
fiierului n care se face logarea.
Ca o mic traducere, ncerc (try) s returnez o nou instan a obiectului FileTra%e, dac nu
reusec acest lucru (catch), initializez St,o*tTra%e care va merge sigur avnd astfel
posibilitatea de a afia mesajele de eroare/debug.
n partea urmtoare, o s ncerc i o implementare a acestui exemplu, cu toate c acum este
destul de intuitiv.
VIII. O implementare
Am scris fiierul r*nTra%e.php:
Cod:
<?php
include_once('TraceFactory.php');
$filename = 'logger.log';
touch($filename);
$t = &TraceFactory::getTrace($filename);
$t->error("O eroare de test!");
$t->setDebug(true);
$t->debug("Debug is true");
for($i=1;$i<10;$i++)
{
$t->debug("Tha lup :: ".$i);
}
unset($t);
$t = &TraceFactory::getTrace();
$t->error("Ceva de test!");
$t->setDebug(true);
$t->debug("True Debug");
for($i=1;$i<10;$i++)
{
$t->debug("Za I :: " . $i);
}
$t->error("FOO IS BAR MUST DIE !!!");
?>
Dup execuie, n consol rezultatul a fost:
Citat:
$ php run:race;php
*'<,*<+,,' *"&"+&+" =66>6 >>>>,
*'<,*<+,,' *"&"+&+" =66>6 >>>>0e#a de test?
*'<,*<+,,' *"&"+&+" 3=92@ >>>>:rue 3e.u
*'<,*<+,,' *"&"+&+" 3=92@ >>>>Aa B && *
*'<,*<+,,' *"&"+&+" 3=92@ >>>>Aa B && +
*'<,*<+,,' *"&"+&+" 3=92@ >>>>Aa B && -
*'<,*<+,,' *"&"+&+" 3=92@ >>>>Aa B && "
*'<,*<+,,' *"&"+&+" 3=92@ >>>>Aa B && '
*'<,*<+,,' *"&"+&+" 3=92@ >>>>Aa B && )
*'<,*<+,,' *"&"+&+" 3=92@ >>>>Aa B && C
*'<,*<+,,' *"&"+&+" 3=92@ >>>>Aa B && D
*'<,*<+,,' *"&"+&+" 3=92@ >>>>Aa B && E
*'<,*<+,,' *"&"+&+" =66>6 >>>>F>> BS 9A6 52S: 3B= ???
iar n fiierul logger.log am:
Citat:
*'<,*<+,,' *"&"+&+" =66>6 >>>> > eroare de test?
*'<,*<+,,' *"&"+&+" 3=92@ >>>> 3e.u is true
*'<,*<+,,' *"&"+&+" 3=92@ >>>> :ha lup && *
*'<,*<+,,' *"&"+&+" 3=92@ >>>> :ha lup && +
*'<,*<+,,' *"&"+&+" 3=92@ >>>> :ha lup && -
*'<,*<+,,' *"&"+&+" 3=92@ >>>> :ha lup && "
*'<,*<+,,' *"&"+&+" 3=92@ >>>> :ha lup && '
*'<,*<+,,' *"&"+&+" 3=92@ >>>> :ha lup && )
*'<,*<+,,' *"&"+&+" 3=92@ >>>> :ha lup && C
*'<,*<+,,' *"&"+&+" 3=92@ >>>> :ha lup && D
*'<,*<+,,' *"&"+&+" 3=92@ >>>> :ha lup && E
dac, comentez linia:
to*%h/$&ilena$e0E
i terg fiierul logger.log, rezultatul va fi (normal, doar n consol, cci constructorul din
FileTra%e va arunca excepia ntruct fiierul nu va exista):
$ php r*nTra%e.php
Citat:
*'<,*<+,,' *"&"D&'E =66>6 >>>>,
*'<,*<+,,' *"&"D&'E =66>6 >>>>> eroare de test?
*'<,*<+,,' *"&"D&'E 3=92@ >>>>3e.u is true
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:ha lup && *
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:ha lup && +
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:ha lup && -
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:ha lup && "
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:ha lup && '
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:ha lup && )
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:ha lup && C
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:ha lup && D
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:ha lup && E
*'<,*<+,,' *"&"D&'E =66>6 >>>>,
*'<,*<+,,' *"&"D&'E =66>6 >>>>0e#a de test?
*'<,*<+,,' *"&"D&'E 3=92@ >>>>:rue 3e.u
*'<,*<+,,' *"&"D&'E 3=92@ >>>>Aa B && *
*'<,*<+,,' *"&"D&'E 3=92@ >>>>Aa B && +
*'<,*<+,,' *"&"D&'E 3=92@ >>>>Aa B && -
*'<,*<+,,' *"&"D&'E 3=92@ >>>>Aa B && "
*'<,*<+,,' *"&"D&'E 3=92@ >>>>Aa B && '
*'<,*<+,,' *"&"D&'E 3=92@ >>>>Aa B && )
*'<,*<+,,' *"&"D&'E 3=92@ >>>>Aa B && C
*'<,*<+,,' *"&"D&'E 3=92@ >>>>Aa B && D
*'<,*<+,,' *"&"D&'E 3=92@ >>>>Aa B && E
*'<,*<+,,' *"&"D&'E =66>6 >>>>F>> BS 9A6 52S: 3B= ???
Totui, nu sunt mulumit de codul scris, i mai mult, pasnd $&ile ca parametru n factory, i
implicit i constructorului din FileTra%e m-am ndeprtat prea mult de exemplul de la care am
pornit.
O s ncerc s rescriu FileTra%ei Tra%eFa%tor3 pentru a ajunge la utilitatea i concluziile
prezentate n exemplul urmat:
Citat:
"urther# factor$ methods prove useful %hen $ou&re not sure %hat concrete implementation of a class to
instantiate. 'nstead# $ou can leave those details to the factor$ method.
'n the above examples $our program didn&t (no% %hether to create "ile)race or S$stem)race instances.
'nstead# $ou can program $our ob*ects to simpl$ use )race and leave the instantiation of the concrete
implementation to a factor$ method.
IX. Ceva corecturi
Aa cum ziceam n finalul ultimului capitol, m-am decis s rescriu FileTra%e i Tra%eFa%tor3,
pentru a fi ct mai aproape de modelul urmat.
FileTra%e.php
Cod:
<?php
include_once('ITrace.php');
/**
* It logs the trace to a file
*
* @todo: implement a custom Exception class
* @package test.factory.trace
* @version 0.2
* @access public
*/
class FileTrace implements Trace
{
/**
* It`s the file handler
* @var handler
* @access private
*/
private $handler;
/**
* debug
* @var bool
* @access private
*/
private $debug;
/**
* The construnctor
* it opens the file handler
*
* @param string the file name
* @return void
* @access public
*/
public function __construct()
{
$file = 'logger.log';
if((!is_file($file)) or (!is_writable($file)))
{
throw new Exception("The file ".$file." is not writable,\nOr
it dosent exist in: ".
__METHOD__." at line: ".__LINE__."!");
}
$this->handler = fopen($file, "a");
}
/**
* Sets the debug
* @param bool debug
* @return void
* @access public
*/
public function setDebug($debug)
{
$this->debug = $debug;
}
/**
* It writes a debug message
* only if debug is setted to true
* @param string message
* @return void
* @access public
*/
public function debug($message)
{
if($this->debug)
{
// only print if debug is true
fwrite($this->handler, date("d-m-Y H:i:s")." DEBUG >>>> ".
$message."\n");
}
}
/**
* It writes an error message
*
* @param string message
* @return void
* @access public
*/
public function error($message)
{
// always print out errors
fwrite($this->handler, date("d-m-Y H:i:s")." ERROR >>>> ".
$message."\n");
}
/**
* Is the Destructor
* just close the handle
* @access public
* return void
*/
public function __destruct()
{
fclose($this->handler);
}
}
?>
Tra%eFa%tor3.php
Cod:
<?php
/**
* Is the factory
*
* @version 0.2
* @access public
* @package test.factory.trace
*/
class TraceFactory
{
/**
* It trys to get a trace
*
* @access public
* @return mixed Trace Interface implementation
*/
public static function &getTrace()
{
try
{
include_once('FileTrace.php');
return new FileTrace();
}
catch (Exception $ex)
{
include_once('StdoutTrace.php');
$t = new StdoutTrace();
$t->error("Could not instantiate FileTrace:\n".$ex-
>getMessage());
return $t;
}
}
}
?>
X. Alte explicaii
Am ncercat s m apropii ct mai mult de exemplul pe care l-am urmat.
Mai bine, constructorul din FileTra%e, ar putea fi rescris aa:
Cod:
<?php
function __construct()
{
$file = 'logger.log';
$this->handler = @fopen($file, "a");
if($this->handler===false)
{
throw new Exception("Cannot create the file hanled!");
}
}
?>
ns, pe windows ar fi mai greu de testat, nu ar trebui s existe ngrijorri legate de faptul c
nu a putea crea fiierul logger.log. Pe linux, innd cont de permisiunile care trebuiesc setate
pentru directorul n care lucrez ar fi totui posibil.
XI. O alt implementare
Am rescris i mini testul r*nTra%e.php astfel:
Cod:
<?php
include_once('TraceFactory.php');
$t = &TraceFactory::getTrace();
$t->error("O eroare de test!");
$t->setDebug(true);
$t->debug("Debug is true");
for($i<;/span>=1;$i<10;$i++)
{
$t->debug("Tha lup :: ".$i);
}
unset($t);
$t = &TraceFactory::getTrace();
$t->error("Ceva de test!");
$t->setDebug(true);
$t->debug("True Debug");
for($i=1;$i<10;$i++)
{
$t->debug("Za I :: ".$i);
}
$t->error("FOO IS BAR MUST DIE !!!");
?>
Teste? Rezultatele au fost previzibile. FileTra%e nu a aruncat nici o excepie cu constructorul
din capitolul X deci totul a fost logat n fiierul logger.log.
Pot fi linitit acum, mi pot scrie scripturile mai departe, folosind i o metod de logare a
evenimentelor produse pe parcursul lor, fr s ma intereseze dac se produce ntr-un fiier
sau pe consol, este treaba factory-ului s decid lucrul sta.
PHP 5, SQLite n Factory?
n articolul anterior am prezentat notiunea de factory n PHP 5. n continuare o s aprofundez
aceste tehnici raportate la o baz de date.
XII. SQLite?
Dup un timp, am zis s ncerc s mai creez nc un produs pentru factory-ul descris n
tutorialul precedent.
Mi-ar fi plcut s am posibilitatea s log-ez erorile i mesajele de debug ntr-un tabel al unei
baze de date.
i cum nc nu am avut posibilitatea s lucrez cu SQLite, am decis ca acesta s fie tipul de
baz de date pe care o s l folosesc.
Prima concluzie?
Dac vreau s folosesc clientul SQLite din lina de comand i apoi s accesez baza de date
creat cu acest client din PHP 5.0 trebuie s folosesc SQLite 2.8.15, nu SQLite 3.0.8. Bazele
de date create cu SQLite 3.0.8 vor putea fi accesate din viitorul PHP 5.1, deci mai am de
asteptat pn n a doua jumtate a acestui an.
Ce este SQLite?
Deci, folosind clientul SQLite, versiune 2.8.15 m-am pus pe treab, i am creat o baz de date
nou:
$ sDlite logger.,b
Am aflat c mi pot scrie sql-ul linitit i apoi l pot importa ntr-o baz de date SQLite.
,*$p.sDl!
Cod:
BEGIN TRANSACTION;
CREATE TABLE logger (id INTEGER PRIMARY KEY,message TEXT,timeEnter DATE
);
CREATE TRIGGER insert_logger_timeEnter AFTER INSERT ON logger
BEGIN
UPDATE logger SET timeEnter = DATETIME('NOW') WHERE rowid = new.rowid;
END;
COMMIT;
Lucruri obinuite aici:
un tabel cu numele logger, ce conine un cmp i, de tip INTEGER cheie primar, un cmp
$essage, unde evident voi ine mesajele i ti$eEnter n care voi pstra data introducerii unui
mesaj nou.
n plus, am creat un TRIGGER, astfel la fiecare insert pe care l voi face, cmpul ti$eEnter se
va actualiza singur (nu o s fie nevoie s i mai zic
insert into logger /ti$eEnter0 Cal*es (ATET-'E/'NOF'0.
insert into logger /$essage0 Cal*es /$$essage0
va fi destul pentru a actualiza cele 3 campuri).
Am descoperit astfel i triggeri n SQLite, dup ce am citit i tutorialul asta.
Am importat fiierul ,*$p.sDl cu comanda:
$ sDlite logger.,b S ,*$p.sDl
Binarul (fiierul .exe pe Windows) ar trebui s fie n PATH pentru a avea comanda sqlite la
prompt.
XIII. Un nou produs, SQLite
Tinnd cont c va trebui s implementez metodele interfeei Tra%e i, urmnd exemplul din
FileTra%e am scris destul de repede i uor S_LiteTra%e.php:
Cod:
<?php
// merge cu sqlite 2.8.15 pe php 5.0!
/*
----------> SQL DUMP
BEGIN TRANSACTION;
CREATE TABLE logger (id INTEGER PRIMARY KEY,message TEXT,timeEnter DATE
);
CREATE TRIGGER insert_logger_timeEnter AFTER INSERT ON logger
BEGIN
UPDATE logger SET timeEnter = DATETIME('NOW') WHERE rowid = new.rowid;
END;
COMMIT;
<---------- SQL DUMP
*/
include_once('ITrace.php');
/**
* It logs the trace to a sqlite db
*
* @todo: implement a custom Exception class
* @package test.factory.trace
* @access public
*/
class SQLiteTrace implements Trace
{
/**
* It`s the db handler
* @var handler
* @access private
*/
private $handler;
/**
* debug
* @var bool
* @access private
*/
private $debug;
/**
* The construnctor
* it opens the db handler
*
* @return void
* @access public
*/
public function __construct()
{
$dbname = 'logger.db';
$this->handler = @sqlite_open($dbname, 0666, $sqliteerror);
if($this->handler===false)
{
throw new Exception($sqliteerror);
}
}
/**
* Sets the debug
* @param bool debug
* @return void
* @access public
*/
public function setDebug($debug)
{
$this->debug = $debug;
}
/**
* It writes a debug message
* only if debug is true
* @param string message
* @return void
* @access public
*/
public function debug($message)
{
if($this->debug)
{
// only insert if debug is true
sqlite_query($this->handler, "INSERT INTO logger (message)
VALUES
(' DEBUG >>>> ".$message."')");
}
}
/**
* It writes an error message
*
* @param string message
* @return void
* @access public
*/
public function error($message)
{
// always log errors
sqlite_query($this->handler, "INSERT INTO logger (message) VALU
ES
(' ERROR >>>> ".$message."')");
}
/**
* Is the Destructor
* just close the handler
* @access public
* return void
*/
public function __destruct()
{
@sqlite_close($this->handler);
}
}
?>
XIV. Un nou Creator
Am reuit s rescriu i Tra%eFa%tor3.php astfel:
Cod:
<?php
/**
* Is the factory
*
* @version 0.3
* @access public
* @package test.factory.trace
*/
class TraceFactory
{
/**
* It trys to get a trace
*
* @access public
* @return object Trace, a trace instance
*/
public static function &getTrace()
{
try
{
include_once('FileTrace.php');
return new FileTrace();
}
catch (Exception $ex)
{
try
{
include_once('SQLiteTrace.php');
$t_sqlite = new SQLiteTrace();
$t_sqlite->error("Could not instantiate FileTrace:\n".
$ex->getMessage());
return $t_sqlite;
}
catch(Exception $sqlite_ex)
{
include_once('StdoutTrace.php');
$t = new StdoutTrace();
$t->error("Could not instantiate SQLiteTrace:\n".
$sqlite_ex->getMessage());
return $t;
}
}
}
}
?>
Chiar dac nu mi place prea mult blocul:
Cod:
<?php
try
{
}
catch (Exception $ex)
{
try
{
}
catch(Exception $sqlite_ex)
{
}
?>
Tracerul meu este funcional avnd 3 metode distincte de a loga mesajele:
ntr-un fiier,
ntr-o baz de date sau
direct pe consol (nu prea o s vd lucrul sta prea curnd totui).
XV. Neajunsuri
n momentul de fa, sincer s fiu, nu mi dau seama unde a putea implementa acest
exemplu.
A vrea s l continui, aducd n discuie un alt procedeu: observer, mai mult, mi-ar plcea s
am mai multe nivele de logare (debug/info/error/alert/emergency).
Metoda getTra%e nu mi se pare prea flexibil, cum ar fi dac a vrea s mai adaug nc un
produs acolo?
Probabil ar trebui s o rescriu astfel:
Cod:
<?php
/**
* Is the factory
*
* @version 0.4
* @access public
* @package test.factory.trace
*/
class TraceFactory
{
/**
* It trys to get a trace
*
* @param string driver, it can be File or SQLite
* @access public
* @return object Trace, a trace instance
*/
public static function &getTrace($driver='')
{
$drivers = array('File','SQLite');
if(!in_array($driver, $drivers))
{
include_once('StdoutTrace.php');
return new StdoutTrace();
}
try
{
$rs = $driver.'Trace';
include_once($rs.'.php');
return new $rs();
}
catch (Exception $ex)
{
include_once('StdoutTrace.php');
$t = new StdoutTrace();
$t->error("Could not instantiate ".$driver.":\n".$ex-
>getMessage());
return $t;
}
}
}
?>
iar testul urmtor, r*nTra%e.php mi-ar loga mesaje n fiierul text n prima parte, n baza de
date SQLite n partea de mijloc i n final a afia i ceva n consol:
Cod:
<?php
include_once('TraceFactory.php');
$t = &TraceFactory::getTrace('File');
$t->error("O eroare de test!");
$t->setDebug(true);
$t->debug("Debug is true");
for($i=1;$i<10;$i++)
{
$t->debug("Tha lup :: ".$i);
}
unset($t);
$t = &TraceFactory::getTrace('SQLite');
$t->error("Ceva de test!");
$t->setDebug(true);
$t->debug("True Debug");
for($i=1;$i<10;$i++)
{
$t->debug("Za I :: ".$i);
}
$t->error("FOO IS BAR MUST DIE !!!");
unset($t);
$t = &TraceFactory::getTrace('Unknow_driver');
$t->error("Ajunge in consola!");
$t->setDebug(true);
$t->debug("True Debug a fos setat");
for($i=1;$i<10;$i++)
{
$t->debug("I-ul :: ".$i);
}
$t->error("Fatal!!!");
?>
Rmne ns de discutat despre diferite niveluri de log i de introducerea unui observer care
s m anune n cazul n care se produce o eroare n sistem.
Pn una-alta, rmn cu PEAR!!Log, dar o s continui totui acest articol prin introducerea
componentelor de mai sus, cea ce nseamn un sitem de logare a mesajelor ct de ct
complet i utilizabil n producie (chiar dac constat c SQLite nu este chiar att de rapid :) ).

S-ar putea să vă placă și