Documente Academic
Documente Profesional
Documente Cultură
Curs PHP
Curs PHP
Limbajul PHP a fost creat in anul 1994 de catre Rasmus Lerdorf, care incerca sa-si personalizeze
propria pagina Web; din acest motiv limbajul a fost numit initial PHP adica: Personal Home Page
(pagina de baza personala). Ulterior limbajul a fost perfectionat, utilitatea si caracteristicile sale s-
au dezvoltat treptat, ajungand sa aiba semnificatia Hypertext Preprprocesor (PHP). Preprocesarea
consta in aceea ca datele sunt interpretate(preprocesate) de catre serverul Web inainte ca acesta
sa genereze cod HTML.
PHP este una dintre cele mai interesante tehnologii pentru site-uri si programare web, imbina
caracteristici dintre cele mai complexe cu simplitatea în utilizare. PHP a devenit un instrument de
frunte pentru dezvoltarea aplicatiilor Web. Spre deosebire de alte instrumente pentru aplicatii
Web, cum este Perl, PHP este un limbaj de programare comod pentru începatori, chiar si pentru cei
care nu au mai desfasurat activitati de programare.
Daca sunteti un cunoscator al limbajului HTML, dar nu aveti experienta în materie de
programare, va puteti pune întrebarea: care sunt functionalitatile suplimentare pe care le poate
asigura cunoasterea limbajului PHP? Ca si alte limbaje de scripting pentru Web, PHP va permite sa
furnizati un continut Web dinamic, adica un continut Web care se modifica automat de la o zi la
alta sau chiar de la un minut la altul. Continutul Web este un element important în sustinerea
traficului unui sit Web; de regula, vizitatorii nu vor mai reveni la o pagina Web care contine aceleasi
informatii ca si cele prezentate la ultima vizita. Pe de alta parte, siturile Web frecvent actualizate
pot atrage cantitati enorme de trafic.
Mai mult, spre deosebire de limbajele de scripting, precum JavaScript, PHP ruleaza pe serverul
Web, nu în navigatorulul Web. În consecinta, PHP poate obtine accesul la fisiere, baze de date si
alte resurse inaccesibile programului JavaScript. Acestea constituie bogate surse de continut
dinamic, care atrag vizitatorii. In plus, putem folosi limbajul PHP pentru a generera cod Java Script.
Secventele de cod PHP pot fi incluse intr-un fisier HTML; ulterior serverul Web va identifica
aceasta secventa de cod , va procesa acesta secventa de cod generand cod HTML iar la final va
inlocui secventa de cod PHP cu codul HTML.
Printre caracteristicile cele mai importante ale imbajului enumeram:
- simplicitate : acest limbaj este simplu de folosit, fiind accesibil si ne-programatorilor. Datorita
acestui fapt el a devenit cel mai popular limbaj de script pentru generarea de pagini HTML
dinamice.
- usor de folosit : limbajul are o sintaxa asemanatoare limbajului C, care este foarte popular in
randul programatorilor. De aceea programatorii care au cunostine de C sau Perl vor face foarte
rapid trecerea spre PHP. Pe de alta parte anumite aspecte cum ar fi: declararea si folosirea
variabilelor este mult simplificata in PHP, spre deosebire de C++ sau alte limbaje de nivel inalt.
- eficienta : specificatiile limbajului includ folositea tehnicilor de POO (Programare orientata pe
obiecte) iar acest lucru contribuie la marirea productivitatii: un programator PHP poate folosi
module scrise de un alt programator fara sa fie nevoit sa cunoasca detalii specifice de
implementare a codului.
- cross-platform : exista implementari ale limbajului pe mai multe sisteme de operare, cele mai
populare fiind cele de pe sistemele Linux si Windows. In acest caz daca scriem cod PHP care ruleaza
pe un sistem Linux, ulterior vom putea folosi acest cod pe un server care ruleaza Windows si
viceversa.
- gratis : PHP reprezinta un program Open Source, oricine poate folosi acest limbaj fara a fi
nevoit sa plateasca ceva. De asemenea utilizatorii au access la sursele PHP (scrise in limbajul C).
Site-ul oficial al limbajului PHP se afla la :www.php.net , datorita popularitatii acestui limbaj exista
numeroase site-uri Web care prezinta informatii despre PHP, exemple de cod, forum de discutii ,
etc.
Acest curs de initiere in PHP si MySQL este menit a prezenta elemente introductive de
programare si dezvoltare a paginilor web folosind PHP. Este important sa retineti ca nu reprezinta
decat un punct de plecare cu lectii si tutoriale php introductive. Dezvoltarea Web este o activitate
solicitanta, iar viitorul dezvoltator Web trebuie sa dispuna de multe abilitati, printre care si pe
aceea de programator. Dezvoltatorii Web începatori vor gasi în aceast curs un prim pas util si
amical în activitatea de programare în PHP.
Un script PHP poate fi foarte simplu sau foarte complex. Totusi, scrierea chiar si a unui script
PHP complex este relativ simpla, necesitand doar un editor de texte obisnuit. In aceasta lectie veti
invata modul de creare si de executare a programelor PHP, veti invata sa creati scripturi PHP
simple, care afiseaza in navigatorul web un text simplu. De asemenea, veti invata sa va
documentati scripturile, astfel incat dumneavoastra si alte persoane sa puteti intelege rapid scopul
si structura acestora.
Mai intai trebuie sa instalati un server web (Apache) si modulul pt. limbajul PHP, acestea sunt
gratuite, le puteti gasi pe net si instala pe fiecare, dar pentru incepatori e recomandat un program
care le are deja configurate (si cu MySQL), precum WampServer, sau sa incarcati scriptul pe un
server web unde este instalat PHP.
Daca nu aveti deja instalat PHP, descarcati de aici -> WampServer, dezarhivati si instalati
programul. (cand este pornit, veti observa o iconita specifica in colltul cu ceasul).
Fisierele .php in care veti scrie scripturile trebuie sa le salvati in directorul www din "wamp", apoi,
ca sa le testati scrieti in browser adresa http://localhost/fisier.php
Primele doua operatii sunt oarecum mai dificil de realizat decat cea de-a treia. Totusi, afisarea
datelor astfel incat acestea sa fie vizibile utilizatorului este o operatie foarte simpla. Asa cum
paragrafele unui text scris sunt compuse din propozitii, programele PHP sunt alcatuite din
instructiuni. Regulile care controleaza formarea propozitiilor se numesc sintaxa. Acelasi termen
este folosit si pentru a desemna regulile care guverneaza formarea instructiunilor PHP.
Iata un exemplu pentru crearea instructiunii PHP care trimite date de iesire la un browser Web,
astfel incat acestea sa fie vizibile pentru un utilizator:
<?php
echo "scrieti aici un text oarecare";
?>
Observati ca instructiunea incepe cu un cavant "echo" si se incheie cu un caracter punct si
virgula (;).
Constructia echo trimite datele de iesire care vor fi afisate de browser.
Ghilimelele duble se folosesc pentru delimitarea unei expresii de tip text, in cazul nostru "scrieti
aici un text oarecare" (se pot folosi si ghilimele simple).
In locul propozitiei "scrieti aici un text oarecare" puteti plasa aproape orice text, cu exceptia altor
ghilimele. Totusi, pentru moment, trebuie sa includeti numai litere, cifre, spatii si semne de
punctuatie folosite in alfabetul latin, precum virgula, caracterul punct si virgula, punctul, semnul de
intrebare si semnul exclamarii. De asemenea, puteti include caracterele < >, folosite pentru
delimitarea etichetelor HTML, respectiv caracterul /, folosit pentru a indica membrul de inchidere
al unei perechi de etichete HTML.
De exemplu, iata o instructiune PHP care are drept date de iesire un fragment dintr-un vers din
Scrisoarea a III-a de Eminescu:
<?php
echo "<h2> Iata vine-un sol de pace…</h2>";
?>
- Ca sa vedeti rezultatul, salvati fisierul cu acest cod in directorul www din "wamp", de exemplu cu
denumirea teste.phpsi apelati in browser adresa http://localhost/teste.php (programul
WampServer trebuie sa fie pornit).
Perechea de etichete H2 determina formatarea datelor de iesire ca titlu HTML de nivel 2.
Scripturile PHP pot fi incluse si in fisiere cu cod HTML, ca in urmatorul exemplu (dar salvate cu
extensia ".php"):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Test PHP</title>
</head>
<body>
<?php
echo "<h4> Exemplu de script PHP inclus in HTML</h4>" ;
?>
</body>
</html>
In browser va aparea :
Nota: Fiecare linie a comentariului trebuie sa inceapa cu doua caractere slash //. Totusi, puteti crea
un comentariu din mai multe linii si in alte moduri. Iata un exemplu:
/*
Acesta este un comentariu pe mai multe linii.
Poate fi alcatuit dintr-un numar oricat de mare de linii.
*/
Pentru a adauga un comentariu alcatuit din mai multe linii, scrieti la inceput caracterele /*, iar la
sfarsit trebuie sa se incheie cu caracterele */. Intre cele doua perechi de caractere, puteti scrie orice
text doriti, folosind oricate linii doriti.
<?php
// Script test
// Acest script afiseaza un mesaj vizibil pentru utilizator.
</body>
</html>
Salvati fisierul cu numele test-script.php
Daca ati instalat un server de PHP pe calculatorul dumneavoastra, salvati fisierul in
directorul www al serverului.
Deschideti browserul si scrieti adresa URL http://localhost/test-script.php
Daca nu aveti instalat un server de PHP pe calculator, incarcati (prin FTP) fisierul test-script.php pe
un server pe web unde este instalat PHP.
Dupa ce v-ati incarcat fisierul cu scriptul, sunteti pregatit pentru a obtine accesul la acesta.
Deschideti browserul Web si apelati adresa URL asociata scriptului dumneavoastra. Adresa URL
trebuie sa fie alcatuita din adresa URL identificata de administratorul serverului unde ati incarcat
scriptul, urmata de un slash (/), urmata de numele fisierului care contine scriptul dumneavoastra.
Daca adresa URL se incheie deja cu un caracter slash, nu trebuie sa mai inserati inca un asemenea
caracter inainte de numele scriptului dumneavoastra.
De exemplu, daca domeniul serverului unde ati incarcat scriptul e http://www.marplo.net/ ca
adresa URL a catalogului care contine scripturile dumneavoastra PHP, puteti obtine accesul la
scriptul dumneavoastra prin intermediul adresei URL http://www.marplo.net/test-script.php
Daca ati tastat corect adresa URL a scriptului dumneavoastra, iar scriptul respectiv nu contine erori,
veti vedea datele de iesire ale scriptului dumneavoastra. Felicitari! Ati devenit programator PHP!
In browser va aparea:
Primul meu script PHP.
Tipuri de siruri si variabile
Învatati tipul variabilelor in PHP
Învatati sa folositi ghilimele si caractere escape pentru a specifica valori de tip sir speciale
Aceste doua mari categorii de date: numere si siruri, formeaza opt tipuri principale de variabile :
- Boolean
- Integer
- Float
- String
- Array
- Object
- Resource
- Null
In mod normal tipul variabilelor nu este specificat explicit; acesta va fi evaluat de catre
interpretorul PHP la momentul run-time (in momentul executarii scriptului).
1. Tipul boolean
Variabilelele de tipul boolean pot lua doar doua valori : FALSE sau TRUE
Variabilele de alt tip decat boolean pot fi convertite la tipul boolean prin operatorul
cast (bool) sau (boolean), plasate inaintea valorilor, desi in general nu e nevoie de aceasta converrire,
valoarea fiind automat recunoscuta de PHP.
2. Tipul integer
PHP foloseste doua categorii de numere: întregi (tipul integer) si duble, cu virgula (tipul float)
Variabilele integer reprezinta numerele intregi, ele pot fi specificate in format zecimal, hexazecimal
sau octal.
Numerele întregi reprezinta numerele fara parte fractionara folosite la numarare, plus zero si
numerele negative. Cu alte cuvinte, în PHP termenul de întreg are aceeasi semnificatie ca si în
matematica. De exemplu, numarul 100 poate fi reprezentat în PHP sub forma de întreg.
Scrierea numerelor PHP este simpla. Un întreg PHP se obtine prin scrierea cifrelor care îi alcatuiesc
valoarea. Daca valoarea este negativa, scrieti un semn minus imediat la stânga numarului. Evitati sa
scrieti spatii sau virgule ca parte a unui întreg PHP.
Iata câteva exemple de numere PHP întregi :
215678 - Numar in reprezentare zecimala
0x1A8; - Numar in reprezentare hexazecimala (reprezinta: 1*16*16 + 10*16 + 8 = 424
(in zecimal))
067 - Reprezinta: 6*8 + 7 = 55 (in zecimal)
Valorile minime, respectiv maxime pe care le poate lua o variabila de tip integer depind de sistemul
de operare pe care ruleaza modulul PHP. De exemplu pentru un sistem Windows valoarea unui
integer se memoreaza pe 32 de biti: 31 bit pentru numar si un bit pentru semn. In acest caz valorile
unui intreg se afla in intervalul :-213 repectiv: 213. Daca incercam sa folosim un integer cu valori care
ies din acest inteval vor avea de-a face cu un fenomen de depasire :integer overflow. In acest caz
interpretorul PHP converteste acesta valoare intr-o valoare de tip float (care are un interval mai
extins de valori).
In PHP simpla impartire a doua valori intregi va produce ca rezultat o variabila de tip float. Pentru a
obtine doar partea intreaga acestui rezultat putem folosi operatorul cast (int) in fata rezultatului.
Ex.: echo (int)8.7; (va returna 8)
Pentru a rotunji rezultatul la intregul cel mai apropiat de valoarea reala se poate folosi functia round(),
unde intre paranteze se adauga valoarea.
Ex.: echo round(8.7); (va returna 9)
3. Tipul float
Reprezinta variabile de tip real [numerele cu virgula], (în lb. engleza se foloseste punctul
zecimal în loc de virgula). De exemplu 2.5
In general, numerele duble (tipul float) sunt stocate folosindu-se formatul standard IEEE-64, care
furnizeaza 64 de biti. Acest format va permite sa stocati valori care pot merge pâna la 1,8 x 10 la
puterea 308 sub forma de numere duble si furnizeaza aproximativ 14 cifre dupa punctul zecimal
(sau cifre semnificative) de precizie.
Iata câteva exemple de numere duble (tipul float)
123.4567 - Numar de tip float
1.2e3; - Reprezinta: 1.2 * 103
4. Tipul string
Reprezinta o insiruire de caractere, fiecare caracter este memorat pe 1 byte; setul de caractere
este limitat la 256 valori distincte. Dimensiunea sirurilor poate fi oricat de mare in PHP, nu exista
specificatii care sa limiteze numarul maxim de caractere dintr-un sir.
Spre deosebire de întregi si de numere float, care contin cifre, sirurile pot contine orice caracter. Ca
atare, sirurile sunt utile pentru stocarea datelor care nu pot fi calculate, precum nume, fraze si
adrese.
1) Un mod simplu de a declara un sir este prin delimitarea cu ghilimele simple (' ')
Daca dorim ca sirul sa contina caracterul ' va trebui sa inseram inaintea lui caracterul escape \.
Daca dorim ca sirul sa contina caracterul \ va trebui sa dublam acest caracter. Acest comportament
este exemplificat in exemplul urmator:
<?php
$var1 = 'Acesta este un sir de test';
echo 'Curs \'PHP\'';
echo '<br />Vrei sa stergi C:\\*.* ?';
echo '<br />Variabila var1=$var1';
echo "<br />Variabila var1=$var1";
?>
In browser va aparea:
Curs 'PHP'
Vrei sa stergi C:\*.* ?
Variabila var1=$var1
Variabila var1=Acesta este un sir de test
Observati diferenta dintre ultimile doua linii!
In penultima linie, unde s-a folosit gilimele simple pentru delimitarea sirului, variabila $var1 nu este
expandata adica nu este afisat valoarea variabilei var1=Acesta este un sir de test ci exact textul scris
(numele ei). Pentru a realiza afisarea valorii variabilei si nu numele acesteia, se folosesc ghilimelele
duble, precum in ultima linie a exemplului de mai sus.
2) O alta metoda pentru a specifica un sir în PHP este prin folosirea ghiimelelor duble (" ").
Daca intr-un sir delimitat prin ghilimele duble vrem ca acesta sa afiseze numele unei variabile, nu
valoarea acesteia, adaugam un caracter backslash (\) inaintea numelui variabiei.
Exemplu; echo "Numele variabilei este \$var";
Acest cod va afisa Numele variabilei este $var, oricare ar fi valoarea variabilei "$var".
Caracterele care alcatuiesc sirul sunt incluse între ghilimele duble (" ");
De exemplu, sirul reprezentând numele fizicianului care a formulat teoria relativitatii este "Albert
Einstein". Asa cum s-a explicat, un sir poate contine date numerice; de exemplu, "3.14159".
Daca se doreste adaugarea de ghilimele duble intr-un sir delimitat de ghilimele duble, se adauga
caracterul \ in fata acestora.
Exemplu; echo "Numele programului este \"PHP\".";
Prin delimitarea cu ghilimele duble PHP faciliteaza includerea în siruri a unor caractere speciale,
precum caracterele de salt la linie noua sau retur de car, prin furnizarea de secvente escape care
reprezinta caractere speciale.
Iata secventele escape folosite în PHP:
\n - salt la linie noua
\r - retur de car (rand nou)
\t - caracter de tabulare pe orizontala
\\ - backslash
\$ - simbolul dolarului
\” - ghilimele duble
Ca exemplu, iata un sir care include un retur de car, urmat de un salt la linie noua: "Salut,
lume!\r\n".
Retineti ca fiecare secventa escape începe cu un backslash (\). Pentru a include un backslash într-un
sir, trebuie sa folositi doua caractere backslash.
Pe langa imbricarea variabilelor in cadrul sirurilor delimitate prin ghilimele duble, PHP pune la
dispozitie operatorul de concatenare a sirurilor: . (punct) . Acest operator adauga un sir la sfarsitul
altui sir. De exemplu:
<?php
$nume = 'Popescu';
$prenume='Costel';
echo 'Numele de familie este '.$nume. 'iar prenumele este '.$prenume;
?>
In browser va aparea:
Numele de familie este Popescu iar prenumele este Costel
In anumite situatii este necesar sa accesam unul dintre caracterele unui sir. Pentru aceasta
putem folosi parantezele{} ca in exemplul de mai jos:
<?php
$var1 = 'Acesta este un sir de test';
echo $var1{0}; // Afisaza A (primul caracter din sir)
echo $var1{2}; // Afisaza e (al treilea caracter din sir)
?>
Rezultatul afisat va fi
Ae
In acest caz delimitatorul este ("<<<"); acesta trebuie urmat de un identificator unic, dupa care
urmeaza sirul de caractere, iar secventa se incheie din nou cu identificatorul mentionat.
Identificatorul de incheiere trebuie sa se afle in prima coloana a liniei, acesta poate contine
caractere alfanumerice dar neaparat trebuie sa inceapa cu o litera, nu cu o cifra sau alt semn.
Veti intelege mai bine studiind exemplu de mai jos:
<?php
$var1 = <<< EOT
Exemplu de sir care foloseste delimitatorul heredoc.
EOT;
echo $var1;
?>
Rezultatul afisat va fi:
Exemplu de sir care foloseste delimitatorul heredoc.
5. Tipul array
Reprezinta un vector de valori (care creaza o matrice, vezi Lectia 9 despre matrice), fiecare
element al matricei are asociat o cheie. Aceasta cheie va fi folosita ulterior la identificarea unui
element specific at matricei. In PHP tipul array se mai numeste si tip map ordonat, deoarece
elemente vectorului sunt ordonate dupa campul cheie.
Variabilele de tip array si lucrul cu acestea vor fi prezentate mai detaliat in lectiile urmatoare. Iata
un exemplu simplu de variabile array:
<?php
$fructe[0] = 'mere';
$fructe[1] = 'caise';
$fructe[2] = 'piersici';
?>
6. Tipul object
Reprezinta de fapt instanta unei clase declarate in PHP. O clasa este o structura care contine
variabile membru si functii membru.
Variabilele de tip object si lucrul cu acestea vor fi prezentate detaliat in lectiile urmatoare.
7. Tipul resource
Este un tip special de variabila care pastreaza o legatura spre resurse externe. Exemple de
resurse externe: manipulatori pentru deschidere de fisiere, conectare la baze de date, compresia
fisierelor, resurse COM, etc...
8. Tipul NULL
Putem afla tipul unei variabile folosind functia gettype() care returneaza un string (sir)
continand tipul variabilei cercetate.
Observati si studiati exemplul de mai jos
<?php
$var1 = TRUE;
$var2 = 100;
$var3 = 23.88;
$var4 = "Nume";
$var[5] = "fructe";
echo gettype($var1);
echo '<br />'.gettype($var2);
echo '<br />'.gettype($var3);
echo '<br />'.gettype($var4);
echo '<br />'.gettype($var[5]);
echo '<br />'.gettype($var6);
?>
In browser va aparea:
boolean
integer
double
string
string
NULL
Observati ca utima linie afisata este NULL, asta deoarece $var6 nu are nici o valoare determinata
Pentru a asocia o valoare unei variabile, veti scrie ceea ce se numeste o instructiune de
atribuire. Iata un exemplu simplu:
$temperatura = 33.5;
Numele variabilei este urmat de un semn egal (=), care identifica instructiunea ca fiind o
instructiune de atribuire. Semnul egal este urmat de valoarea care urmeaza a fi atribuita variabilei,
în acest exemplu, valoarea este data de valoarea literala dubla (float) 33.5. Caracterul punct si
virgula (;) marcheaza sfârsitul instructiunii.
Exemplul anterior a atribuit unei variabile o valoare-literala. De asemenea, puteti atribui valoarea
unei variabile catre o alta variabila, prin scrierea unei instructiuni de atribuire astfel:
$castigator = $nume;
În acest caz, valoarea variabilei $nume devine valoarea variabilei $castigator. Acest procedeu se
numeste atribuire prin referinta. Astfel o modificare facuta asupra lui $nume se va propaga
automat si asupra variabilei $castigator.
Iata exemplul de mai sus asa cum va aparea intr-un script PHP simplu :
<?php
$nume = "Cosmin";
$castigator = $nume;
echo $castigator;
?>
Rezultatul afisat va fi:
Cosmin
Forma valorii unei variabile se numeste tipul variabilei. Tipul unei variabile se poate modifica
daca atribuiti variabilei o valoare de un tip diferit fata de cel al valorii curente a variabilei.
De exemplu, instructiunea de atribuire
$x = 3;
Atribue variabilei $x tipul integer.
Daca instructiunea de atribuire
$x = 3.5;
va fi executata ulterior, variabila $x devine de tip float.
Desi instructiunile de atribuire din limbajul PHP si ecuatiile matematice folosesc ambele semnul
egal, cele doua notiuni sunt foarte diferite, deoarece atribuirea nu este acelasi lucru cu egalitatea.
Atribuirea este o operatie care înlocuieste o valoare cu o alta. Pe de alta parte, egalitatea este o relatie
între doua valori. Când doua valori sunt egale, acestea ramân egale pentru totdeauna. Totusi, puteti
atribui o valoare unei variabile si ulterior puteti atribui aceleiasi variabile o alta valoare. Cu alte cuvinte,
egalitatea este permanenta; atribuirea nu este.
Variabilele declarate mai sus sunt definite de utilizator. In PHP exista si alte variabile numite
"variabile predefinite" care rezida in nucleul PHP, sunt alocate automat de catre modulul PHP, si
sunt accesibile in program.
In continuare enumeram citeva dintre aceste "Variabile Superglobale" (accesibile din toate
scripturile PHP):
$GLOBALS – contine referinte la variabilele globale disponibile in scriptul curent.
$_SERVER – variabile definite de server sau relative la contextul in care se executa scriptul
curent
$_GET – variabile furnizate scriptului prin adresa URL
$_POST – variabile furnizate scriptului prin metoda HTTP POST (in general prin formulare)
$_COOKIE – variabile furnizate scriptului prin HTTP cookie
$_FILES – furnizeaza scriptului fisierele uploadate
$_SESSION – variabile care sunt inregistrate in sesiunea scriptului
2. Operatori
Pentru a va ajuta sa efectuati calcule si prelucrari ale datelor, PHP include o diversitate de
operatori si functii utile. Când combinati valorile literale si variabilele cu operatori si functii,
construiti ceea ce este cunoscut sub numele de expresii.
Operatorii sunt simboluri specifice care realizeaza o actiune specifica in cadrul unei expresii.
Operatorii actioneaza asupra variabilelor prezente in expresie. De exemplu in cadrul expresiilor
matematice vom folosi operatori aritmetici.
$a + $b Adunare : a+b
$a - $b Scadere : a-b
$a * $b Inmultire: a*b
$a / $b Impartire: a/b
$a%$a Moule :restul impartirii lui a la b
$a +=$b Echivalent cu: $a = $a + $b
$a -=$b Echivalent cu: $a = $a - $b
$a *=$b Echivalent cu: $a = $a * $b
$a /=$b Echivalent cu: $a = $a / $b
$a++ Incrementare ; Ecivalent cu $a = $a +1
$a-- Decrementare; Echivalent cu $a = $a -1
O proprietate interesanta a operatorului de împartire este aceea ca returneaza o valoare
întreaga daca ambii sai operanzi sunt întregi si rezultatul este un întreg; în caz contrar, returneaza o
valoare cu virgula (de tip float). Astfel, instructiunea de atribuire
$x = 10/3;
atribuie valorii $x valoarea cu virgula 3.3333333333333, chiar daca operanzii operatorului de
împartire sunt ambii întregi.
Similar operatorului de împartire, operatorul modulo executa o împartire; cu toate acestea,
operatorul modulo returneaza restul, nu câtul împartirii. De exemplu, prin împartirea lui 10 la 3 se
obtine câtul 3 si restul 1. Deci, instructiunea de atribuire
$x = 10%3;
atribuie variabilei $x valoarea 1.
Operatorii de incrementare $a++ si decrementare $a-- au un efect diferit daca sunt scrisi ++
$a respectiv --$a
In primul caz, daca avem de exemplu
$x= $a++;
i-se atribue lui $x valoarea variabilei $a dupa care se efectueaza operatia de incrementare ($a = $a
+ 1)
Dar daca avem
$x = ++$a=
se efectueaza operatia de incrementare ($a = $a + 1) dupa care i-se atribue lui $x noua valoarea a
lui $a
Ca în matematica, PHP evalueaza operatorii de înmultire si de împartire anterior operatorilor de
adunare, respectiv scadere. Aceasta caracteristica se numeste precedenta.
Datorita precedentei, instructiunea
$x=1+2*3;
atribuie variabilei $x valoarea 7, chiar daca operatorul de adunare apare înaintea celui de înmultire. Se
respecta regulile din matematica. Daca doriti sa controlati precedenta unei expresii, puteti folosi
paranteze. De exemplu, instructiunea
$x=(1+2)*3;
atribuie variabilei $x valoarea 9, deoarece partea inclusa între paranteze a expresiei este evaluata
prima, asa cum se procedeaza în algebra.
In afara de acesti operatori numerici, PHP include un operator de concatenare a sirurilor (.),
denumit uneori operator de unire, deoarece functia sa consta în unirea sirurilor.
Sa observam urmatorul exemplu:
<?php
$var1 = 'Ionescu';
echo 'Numele candidatului este '.$var1;
$var2 = 'Candidat: ';
$var2 .= $var1;
echo "<br />$var2";
?>
Rezutatul afisat va fi:
Numele candidatului este Ionescu
Candidat: Ionescu
In exemplul de mai sus se observa folosirea operatorului de concatenare . (punct)
Acest operator adauga la sfarsitul sirului curent noul sir furnizat ca parametru.
Expresia $a .= 'Sir de test' este echivalenta cu : $a = $a . 'Sir de test'.
3. Functi i
În afara de operatori, PHP include functii care executa operatii utile. Iata unele exemple de
functii:
abs(x) - Returneaza valoarea absoluta a lui 'x'
ceil(x) - Returneaza valoarea 'x', rotunjita la întregul imediat superior
floor(x) - Returneaza valoarea 'x', rotunjita la întregul imediat inferior
max(x,y,...) - Returneaza valoarea maxima a unui set de valori
min(x,y,...) - Returneaza valoarea minima a unui set de valori
pow(x,n) - Returneaza numarul 'x', ridicat la puterea specificata 'n'
strftime(f) - Returneaza data curenta, formatata conform continutului parametrului 'f'
sqrt(x) - Returneaza radacina patrata a lui 'x'
În afara de acestea, PHP include multe alte functii. Consultati site-ul www.php.net
Majoritatea functiilor necesita una sau mai multe valori de intrare, cunoscute sub numele de
argumente. De exemplu, functia "sqrt" necesita un argument (aici este 'x') care specifica valoarea a
carei radacina patrata trebuie calculata.
Unele functii, precum min si max, preiau un numar nedefinit de argumente. Alte functii nu
necesita nici un fel de argumente. Pentru a putea folosi o functie în mod corespunzator, trebuie sa
cunoasteti:
Numele functiei
Actiunea functiei si valoarea returnata de aceasta, daca exista
Numarul argumentelor preluate de functie
Semnificatia fiecarui argument
Iata un exemplu simplu care foloseste o functie pentru calculul lungimii laturilor unui patrat,
daca este cunoscuta aria patratului:
$latura=sqrt($arie);
Retineti modul în care argumentul functiei este inclus între paranteze, precum si modul în care
functia si argumentul sau sunt folosite într-un mod asemanator cu o valoare literala sau o
variabila.
Iata un exemplu care prezinta modul de utilizare a functiei "max", care preia mai multe argumente:
$punctaj_maxim=max($punctaj1, $punctaj2, $punctaj3);
Nume:
Trmite formular
Metoda GET permite transmiterea unui volum limitat de informatii catre server; de asemenea nu
este recomandata folosirea acestei metode in cazul in care dorim sa transmitem date personale(de
exemplu parolele introduse intr-un formular pot fi vizualizate de oricine in browserul de Web).
Sa luam un exemplu practic de formular HTML care trimite date (prin method="post") la un script
PHP unde acestea vor putea fi vizualizate.
Salvam scriptul de mai jos intr-un fisier pe care-l numim "test-form.php"
<?php
$nume = $_POST['nume'];
$email = $_POST['email'];
$parola = $_POST['parola'];
Nume:
Email:
Parola:
Trmite datele
Deoarece cunoastem metoda prin care trimitem datele catre scriptul PHP, "POST", am folosit
variabila PHP globala _POST pentru a prelua datele din formular:
$_POST['nume']
$_POST['email']
$_POST['parola']
Exemplul include numai doua perechi "nume-valoare"; cu toate acestea, puteti include oricâte
asemenea perechi doriti (separate prin caracterul &), in functie de limita impusa de browser.
Pentru a prelua si folosi datele dintr-o astfel de adresa URL, folositi in interiorul scriptului PHP
expresia "$_GET['nume'], ca in exemplu urmator"
$var1 = $_GET['nume1']
$var2 = $_GET['nume2']
Unde "nume1" si "nume2" sunt numele variabilelor din adresa URL, iar "$var1" si "$var2" sunt
variabilele care vor fi folosite in scriptul PHP (din "fisier.php") si a caror valori vor fi "valoare1"
respectiv "valoare2" continute in adresa URL.
Daca doriti sa trimiteti unui script, prin intermediul adresei sale URL, caractere speciale precum un
semn al intrebarii, un semn egal sau un ampersand, se poate crea confuzie.
Pentru a functiona corect, un sir trebuie sa fie codificat URL. Pentru a codifica URL un sir, caracterele
speciale se înlocuiesc cu echivalentele lor hexazecimale, precedate de un simbol procent (%). Pentru
alte detalii, consultati lectia despre Utilizarea caracterelor speciale, subtitlul 4 ( Conversia
adreselor URL).
De exemplu, forma codificata URL a sirului "la multi ani!" este %22la multi ani%21%22.
Adresa URL rezultanta se numeste "sir de interogare" si nu poate contine spatii. Daca doriti sa
trimiteti un spatiu ca parte a unui sir de interogare, trimiteti în locul spatiului un semn plus (+). Iata
un exemplu de sir de interogare care codifica numele autorului acestui site:
http://www.marplo.net/script.php?autor=Mar+Plo
Unele dintre cele mai comune caractere speciale si echivalentele lor codificate URL sunt prezentate
în tabelul de mai jos:
La vizualizarea rezultatelor unui script PHP se pot produce numeroase erori, chiar daca scriptul
în sine este corect.
- Daca vedeti textul scriptului dumneavoastra sau o caseta de dialog prin care sunteti întrebat daca
doriti sa descarcati fisierul care contine scriptul, este posibil ca extensia fisierului script sa fie
incorecta sau ca serverul PHP sa nu functioneze. Desi fisierele script PHP trebuie sa aiba, în general,
extensia .php, este posibil (dar mai rar) ca un administrator de sistem sa configureze un server PHP
astfel încât acesta sa impuna o alta extensie de fisier. Astfel, daca scriptul dumneavoastra esueaza
din unul dintre aceste doua motive, luati legatura cu administratorul dumneavoastra de sistem.
- Daca vedeti un mesaj în care se spune ca scriptul nu exista, este posibil ca dumneavoastra sa fi
tastat incorect adresa URL. Verificati daca ati tastat corect adresa URL identificata de
administratorul dumneavoastra de sistem, precum si daca ati atasat corect la aceasta numele
fisierului care contine scriptul, folosind un slash numai daca adresa URL identificata de
administratorul dumneavoastra de sistem nu se încheie cu acest caracter.
- Daca vedeti un mesaj în care se arata ca browserul dumneavoastra Web nu are permisiunea de a
obtine accesul la script, poate ca este necesar sa modificati permisiunile fisierului script. Pentru a
afla cum trebuie procedat, consultati-va cu administratorul de sistem.
- Daca vedeti un mesaj în care se spune ca scriptul dumneavoastra contine o eroare, verificati daca
nu a aparut vreuna din urmatoarele probleme:
O eroare de tastare, cum ar fi scrierea gresita a cuvântului echo
O eroare de punctuatie, cum ar fi paranteze, ghilimele sau punct si virgula, lipsa sau inserate
gresit
Neincluderea sau includerea eronata a liniilor de delimitare a scriptului, în speta <?php si ?>
Un marcaj de comentariu ( / / ) care lipseste sau care a fost introdus gresit
De exemplu, iata un script care contine un tip de eroare frecvent întâlnit. Puteti identifica eroarea?
<?php
// Acest script contine o eroare de sintaxa
echo "Salut, World Wide Web!;
?>
Din script lipseste caracterul ghilimele duble de închidere, care trebuie sa delimiteze expresia
de tip text. Daca încercati sa executati acest script, puteti vedea doar o pagina goala sau o eroare
similara celei prezentate în continuare.
Parse error. Parse error in /home/bmccarty/public_html/php/module-01/syntax-error.php On line 7
Mesajul de eroare încearca sa va indice sursa erorii, indicând numarul liniei la care s-a produs
eroarea. Totusi, remarcati ca mesajul va îndruma spre linia 7 a unui script care contine numai 4
linii. Din moment ce ghilimelele duble de închidere lipsesc, serverul PHP cauta dincolo de sfârsitul
scriptului pentru a gasi ghilimelele duble respective. Ca atare, serverul PHP este oarecum derutat
cu privire la sursa erorii.
Morala este aceea ca nu puteti conta în totalitate pe serverul PHP pentru a determina locatia
erorii; folositi numarul de linie furnizat de server numai ca îndrumar pentru a depista locatia
probabila a erorii.
3. Tratarea erorilor
Modulul PHP poate fi configurat astfel incat sa afiseze erorile intilnite in codul PHP. Acest lucru
poate fi foarte util in cazul depanarii programelor. Pentru a activa afisarea erorilor exista doua
metode:
- modificarea parametrului display_errors din fisierul de configurare "php.ini"
- folosirea functiei ini_set(‘display_errors’);
In cazul primei metode trebuie sa avem drepturi de administrator pentru a modifica fisierul php.ini.
Nu se recomanda setarea parametrului display_errors la valoarea 1(TRUE) in cazul site-urilor de
productie; mesajele de eroare afisate nu sint folositoare utilizatorului. Pe de alta parte aceasta ar
contribui la marirea riscului unui atac.
A doua metoda consta in folositrea functiei ini_set, care permite unui script sa redefineasca
temporar un parametru din fisierul de configurare php.ini.
Consideram un exemplu de cod in care intentionat incercam sa citim variabile care nu exista:
<?php
ini_set('display_errors',1);
echo "Valoarea transmisa este ".$var;
?>
In exemplul de mai sus daca variabila cu nume: "var" nu exista PHP va afisa un mesaj de eroare
de genul:
Notice: Undefined variable: var
Putem determina tipurile de erori pe care le semnaleaza PHP folosind
functia: error_reporting(). Aceasta preia o constanta care specifica nivelul la care se afiseaza
erorile.
error_reporting(E_ALL) - semnaleaza toate tipurile de erori
error_reporting(E_ALL & ~E_NOTICE) - semnaleaza toate erorile in afara de anunturi
error_reporting(0) - dezactiveaza acesta caracteristica.
Exemplu :
<?php
ini_set('display_errors',1);
error_reporting(E_ALL & ~E_NOTICE);
În aceasta lectie vom discuta despre constante si variabile dinamice. Puteti scrie programe PHP
utile si complexe fara a utiliza constante sau variabile dinamice. Daca utilizarea constantelor poate
facilita citirea programelor dumneavoastra, variabilele dinamice au un efect contrar. Din acest
motiv, în general se recomanda evitarea variabilelor dinamice, mai ales de catre programatorii PHP
începatori. Totusi, va puteri afla în situatia de a lucra la un program PHP scris de o persoana care
foloseste aceste variabile; prin urmare, trebuie sa aveti cunostinte despre variabilele dinamice,
indiferent daca le folositi sau nu în propriile dumneavoastra programe.
O variabila dinamica este denumita folosind doua simboluri ale dolarului ($$) si este asociata cu
o variabila obisnuita care are un nume similar si include un singur simbol al dolarului.
In exemplul de mai sus, variabila dinamica $$film este asociata cu variabila obisnuita, dar cu aceasi
nume, $film.
Valoarea unei variabile obisnuite da numele (fara un simbol al dolarului) unei a doua variabile
ordinare, în exemplu nostru, a doua variabila obisnuita este $oameni_buni. Valoarea acestei a
doua variabile obisnuite este valoarea variabilei dinamice: în exemplu, aceasta este valoarea 12.
Deci valoarea variabiei dinamice $$film, si care va fi afisata de functia "echo" este 12.
O variabila dinamica nu contine, practic, propria sa valoare. În schimb, contine amplasamentul
unde se poate gasi valoarea; cu alte cuvinte, numele unei alte variabile.
Daca variabilele dinamice vi se par derutante, asa e, variabilele dinamice sunt derutante. Sunt rar
folosite, uneori este posibila reducerea dimensiunilor unui program folosind una sau mai multe
variabile dinamice.
Conversia fortata de tip, si anume (int), determina tratarea variabilei $y ca pe un întreg (integer), iar
valoarea acesteia devine 2, în loc de 2.5, care este valoarea reala a variabilei $y. Astfel valoarea
lui $z care va fi afisata de expresia "echo" este 3.
Tabelul urmator indica si alte conversii fortate de tip care se pot folosi si expresiile care trebuesc
utiizate:
Conversie fortata Rezultat
(int), (integer) - Conversie fortata la întreg
(real), (double),
- Conversie fortata la dublu
(float)
(string) - Conversie fortata la sir
- Conversie fortata la tablou
(array)
(matrice)
(object) - Conversie fortata la obiect
O alta modalitate de a trata o variabila ca si cum ar fi de un tip specificat este folosirea unor
functii specifice.
Ca exemplu de utilizare a uneia dintre functiile respective, luati în considerare si studiati urmatorul
exemplu:
<?php
$x = 1.5;
$y = intval($x);
echo $x;
echo "<br />$y";
?>
Rezultatul afisat va fi:
1.5
1
Valoarea 1.5 este afisata ca valoare a variabilei $x, iar valoarea l este afisata ca valoare a
variabilei $y.
Tabelul urmator prezinta si alte functii foosite pentru a trata o variabila ca si cum ar fi de alt tip.
Functie Operatie
doubleval(), - Trateaza argumentul ca fiind de tip
floatval() dublu.
- Trateaza argumentul ca fiind de tip
intval()
întreg.
- Trateaza argumentul ca fiind de tip
strval()
string
Nici conversia normala si nici cea fortata nu modifica tipul unei variabile. Ambele mecanisme
determina tratarea variabilelor doar in expresia respectiva ca si cum ar fi de un alt tip.
Totusi, modificarea tipului unei variabile este posibila prin utilizarea functiei settype().
Acest procedeu este ilustrat în urmatorul exemplu:
$x = 1.5;
settype($x,"integer");
echo $x; // Va afisa valoarea 1
Sa ne amintim din lectia 2 ca exista o functie conexa, gettype(), care returneaza un sir care indica
tipul variabilei specificate. Scriptul urmator afiseaza "integer", care indica tipul variabilei $x:
$x = 1;
echo gettype($x);
Aceasta expresie conditionala foloseste operatorul <, care are, în esenta, aceeasi semnificatie ca în
algebra. Expresia are valoarea TRUE daca si numai daca valoarea variabilei $a este mai mica decât 1;
în toate celelalte cazuri, are valoareaFALSE.
Puteti forma expresii conditionale complexe prin unirea a doua expresii conditionale cu ajutorul unui
operator logic. De exemplu, expresia urmatoare este adevarata daca ambele expresii conditionale
care o compun sunt adevarate:
$a < 1 AND $b < 1
Cu alte cuvinte, expresia este adevarata daca atât variabila $a, cât si variabila $b au valori mai mici
decât 1.
PHP furnizeaza un set de asemenea operatori relationali, prezentati pe scurt în tabelul de mai jos.
Puteti folosi operatorii logici pentru compararea sirurilor; cu toate acestea, un sir care apare într-o
expresie conditionala este convertit la o valoare numerica înainte de evaluarea expresiei. Deseori, se
ajunge la rezultate neasteptate, în general, valorile sirurilor trebuie sa fie comparate folosind o functie
de comparare a sirurilor; aceste functii vor fi explicate în lectiile urmatoare.
Operatori logici
Operator Descriere
$a < $b - TRUE daca valoarea lui $a este mai mica decât valoarea lui $b.
$a > $b - TRUE daca valoarea lui $a este mai mare decât valoarea lui $b.
$a >= $b - TRUE daca valoarea lui $a este mai mare sau egala cu valoarea lui $b
$a <= $b - TRUE daca valoarea lui $a este mai mica sau egala cu valoarea lui $b
$a = $b - TRUE daca valoarea lui $a este egala cu valoarea lui $b.
- TRUE daca $a si $b sunt identice; cu alte cuvinte, daca $a si $b au
$a == $b
acelasi tip si aceeasi valoare
$a != $b - TRUE daca valoarea lui $a este diferita de valoarea lui $b
- TRUE daca $a si $b nu sunt identice; cu alte cuvinte, daca $a si $b nu
$a !== $b
sunt de acelasi tip si aceeasi valoare
$x AND $y - TRUE daca atât $x, cât si $y sunt adevarate
$x && $y - TRUE daca atât $x, cât si $y sunt adevarate.
$x OR $y - TRUE daca minimum una din expresiile $x sau $y este adevarata.
$x || $y - TRUE daca minimum una din expresiile $x sau $y este adevarata.
$x XOR $y - TRUE daca numai una din expresiile $x sau $y este adevarata.
!$x - TRUE daca $x este FALSE
NOT $x - TRUE daca $x este FALSE
Retineti ca puteti prefixa o expresie conditionala cu operatorul !, care inverseaza valoarea "TRUE"
sau "FALSE" a operandului sau.
Observati ca PHP foloseste doi operatori logici care executa aceeasi operatie (AND si &&)
respectiv (OR si ||).
Cu toate acestea, operatorii difera din punctul de vedere al precedentei - caracteristica care
determina ordinea în care sunt executate operatiile în timpul evaluarii expresiilor.
Operatorii && si || au o precedenta relativ ridicata, în timp ce operatorii AND si OR au o
precedenta relativ redusa. Este la fel ca in aritmetica unde, intr-o ecuatie ca aceasta: a + b * c se
executa intai inmultirea si apoi adunarea, chiar daca ordinea lor este alta (daca nu sunt folosite
paranteze). La fel si in PHP, se pot folosi paranteze rotunde pentru a controla ordinea executarii
operatiilor.
Pentru comoditate, puteti forma expresii conditionale fara un operator logic. De exemplu, daca $a
este o variabila numerica, puteti folosi expresia $a ca expresie conditionala. Expresia este
considerata ca având valoarea FALSE daca valoarea variabilei $a este zero, respectiv valoarea TRUE
daca valoarea variabilei respective este diferita de zero.
Daca folositi un sir ca expresie conditionala, expresia are valoarea FALSE daca sirul este vid sau
daca are valoarea speciala "\0", care simbolizeaza un octet cu valoarea zero.
Similar, utilizarea unei valori nedefinite ca expresie conditionala determina obtinerea valorii FALSE.
Daca folositi un tablou sau un obiect ca expresie conditionala, aceasta are valoarea FALSE daca
tabloul sau obiectul sunt vide (fara vreo valoare); în caz contrar, expresia are valoarea TRUE.
In acest din urma caz daca expresia logica din paranteze: conditie este adevarata se vor executa
instructiunile: Instructiune(1); Instructiune(2); , iar daca valoarea expresiei logice : conditie are
valoarea FALSE se vor executa instructiunile: Instructiune(3); Instructiune(4);
Instructiunea asociata unei instructiuni if sau else poate fi ea însasi o instructiune if. O asemenea
instructiune if se numeste "instructiune if imbricata".
Iata un exemplu de instructiune if imbricata:
<?php
$numar = 88;
if ($numar > 10)
if ($numar > 100)
echo "Acesta este un numar mai mare decat 100";
else
echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10";
else
echo "Acesta este un numar mic";
?>
Exemplul afiseaza mesajul "Acesta este un numar mai mare decat 100" daca valoarea
variabilei $numar depaseste 100; în caz contrar, daca valoarea variabilei $numar este mai mare
decât 10 si mai mica decat 100, se afiseaza mesajul "Acesta este un numar mai mic decat 100, dar
mai mare decat 10". Daca valoarea variabilei $numar este mai mica sau egala cu 10, exemplul
afiseaza mesajul "Acesta este un numar mic".
Instructiunile if imbricate pot deveni extrem de dificil de înteles daca numarul de instructiuni si
nivelul de imbricare nu sunt relativ reduse. Deci trebuie sa le folositi cu economie.
O instructiune corelata atât cu instructiunea if, cât si cu instructiunea else, este instructiunea elseif.
Când este folosita corect, poate fi mai simplu de înteles decât o instructiune if imbricata, logic
echivalenta cu aceasta.
Iata un exemplu de instrutiune elseif:
<?php
$numar = 88;
if ($numar > 100 )
echo "Acesta este un numar mai mare decat 100";
elseif ($numar > 10)
echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10";
elseif ($numar > 1)
echo "Acesta este un numar mic";
else
echo "Acesta este un numar foarte mic";
?>
Exemplul extinde functionalitatea exemplului anterior, afisând mesajul "Acesta este un numar foarte
mic" pentru valori ale variabilei $numar mai mici sau egale cu 1.
Într-un caz general, cu o instructiune if si cu o instructiune else poate fi asociat un numar mult mai
mare de instructiunielseif. PHP evalueaza expresiile conditionale în mod succesiv, pornind de la
expresia conditionala asociata instructiunii "if". PHP executa instructiunea asociata primei expresii
conditionale care are valoarea TRUE; daca nici o expresie conditionala nu are valoarea TRUE, PHP
executa instructiunea asociata cu instructiunea else. Este permisa omiterea instructiunii else, caz în
care nu este executata nici o instructiune daca nici una din expresiile conditionale nu are valoarea
TRUE.
2. Operatorul ? :
Operatorul conditional ?:, denumit uneori "operator ternar" sau "operator întrebare-doua
puncte", constituie o alta modalitate de a scrie decizii în PHP.
Acest operator formeaza o expresie care se poate folosi în multe contexte PHP. Iata sintaxa de
utilizare a acestuia:
expresie-conditionala ? valoare-TRUE : valoare-FALSE
Observati cum semnul întrebarii este separat de caracterul doua puncte prin valoarea valoare-TRUE.
Operatorul conditional îsi evalueaza expresia conditionala. Daca expresia este evaluata la valoarea
TRUE, operatorul conditional returneaza valoarea valoare-TRUE; în caz contrar, returneaza
valoarea valoare-FALSE.
De exemplu, sa luam în considerare urmatoarea instructiune de atribuire, care foloseste un operator
conditional:
$a = ($b > $c) ? 10 : 20
Aceasta instructiune de atribuire compara valorile variabilelor $b si $c. Daca valoarea variabilei $b
este mai mare decât aceea a variabilei $c (adica TRUE), atunci variabilei $a îi este atribuita valoarea
10; în caz contrar, variabilei respective îi este atribuita valoarea 20.
Dupa care se trece la corpul instructiunii for, aici, instructiunea $suma += $n si echo "Suma intregilor
de la 1 la $n este $suma."; reprezinta corpul instructiunii for.
Dupa executarea corpului functiei se verifica din nou expresia de test (conditie) dintre paranteze,
daca rezultatul este TRUE se trece mai departe la expresia "pas" (a treia din paranteze) si mai
departe la corpul functiei for. Dupa aia din nou la expresia de test dintre paranteze..., pana cand
rezultatul este FALSE (in exemplu nostru, $n>3)
Instructiunea for este utila pentru numarare si executarea în mod repetat a unor actiuni.
Instructiunea while executa un set de instructiuni atita timp cit valoarea expresiei "conditie" este
adevarata:
Forma generala a instructiuni while este urmatoarea :
while(conditie) {
Instructiune(1);
Instructiune(2);
Instructiune(3);
.............
}
Setul de instructiuni Instructiune(1), Instructiune(2), etc... se vor executa atita timp cit valoarea
expresiei logice "conditie" are valoarea TRUE.
Sa studiem un exemplu practic:
<?php
$n = 0;
$suma = 0;
while ($n <= 3) {
$suma = $suma +$n;
$n++;
}
echo "Suma este $suma";
?>
In scriptul de mai sus avem la inceput (in afara lui "while") $n = 0 si $suma = 0, se verifica conditia din
paranteza a functiei while ($n<=3), cum aceasta este TRUE (deoarece la aceasta etapa $n = 0), se
trece la executarea corpului functiei unde : $suma = $suma + $n si $n++ (adica $n = $n + 1), astfel
acum $n va fi egal cu 1, se verifica din nou conditia din paranteze, care este TRUE ($n fiind acum egal
cu 1), se executa iar corpul functiei..., si tot asa se executa aceasta "bucla" pana cand la verificarea
conditiei din paranteze rezultatul este FALSE, in acest moment se incheie executia functiei while si se
trece mai departe la urmatoarea functie (in cazul nostru: echo "Suma este $suma";, unde dupa
executia functiei while $suma a devenit egala cu 6).
In browser va aparea urmatorul rezultat:
Suma este 6
Pentru a crea o matrice, atribuiti unui element al matricei o valoare si o cheie. De exemplu,
urmatoarea instructiunea de atribuire:
$clasa[1] = "geometrie";
creeaza un tablou denumit "$clasa" si un element cu valoarea "geometrie" identificat prin cheia
"1".
Pentru a stoca în matrice o a doua valoare, puteti folosi urmatoarea instructiune de atribuire:
$clasa[2] = "algebra";
Pentru a obtine acces la un element al matricei, specificati numele matricei si valoarea cheii. De
exemplu, instructiunea de atribuire
$clasa_mate = $clasa[1];
Deoarece valoarea cheilor nu a fost specificata, acestea vor fi automat trecute de program ca
numere intregi consecutive, incepand de la "0" (prima cheie va avea valoarea '0', a doua cheie va
avea valoarea '1', ...)
Aceasta instructiune creeaza o matrice care contine urmatoarele asocieri:
0 => Perl
1 => PHP
2 => Python
Daca doriti sa asociati unei valori o anumita cheie, puteti folosi operatorul =>, astfel:
$limbaje = array(10=>"Perl", "PHP", "Python");
Ca si în cazul utilizarii unei instructiuni de atribuire pentru crearea unei matrice valorile cheilor
nu trebuie sa fie consecutive si nici macar întregi:
$limbaje = array("PHP"=>"Ridicat", "Python"=>"Mediu", "Perl"=>"Redus");
Puteti obtine acces la valoarea asociata cheii 2 prin intermediul unei instructiuni ca aceasta:
$y = 3*$x[2];
Similar, puteti modifica valoarea asociata cheii 3 prin intermediul unei instructiunu ca aceasta:
$x[3] = 101;
Un tablou ale carui chei sunt valori întregi consecutive se numeste "tablou secvential".
În general, valoarea cea mai mica a unei chei dintr-un tablou secvential este zero; totusi, puteti
crea un tablou secvential folosind valoarea 1 sau orice alta valoare întreaga ca valoare minima a
cheii.
În cazul în care cunoasteti valoarea minima a cheii unui tablou secvential, puteti parcurge iterativ
tabloul folosind o bucla for. Pentru aceasta, initializati variabila de bucla la valoarea cea mai redusa
a cheii. Folositi functia count()pentru a forma expresia de test (conditia) a buclei.
Functia count() returneaza numarul elementelor dintr-un tablou.
Iata un exemplu simplu
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
echo "<br />$i => $limbaje[$i]";
}
?>
Prima variabila $imbaje creeaza tabloul.
Cea de-a doua variabila $limita foloseste instructiunea count() pentru a obtine numarul elementelor
din tablou.
Instructiunea for foloseste variabila bucla $i pentru a parcurge iterativ (element cu element) tabloul;
corpul instructiunii include o instructiune echo care afiseaza cheia si valoarea fiecarui element din
tablou.
Datele de iesire vor fi astfel:
0 => Perl
1 => PHP
2 => Python
Sa ne concentram asupra problemei de a determina daca un tablou contine o anumita valoare.
Iata un exemplu:
<?php
$limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python");
$cauta = PHP; // se cauta in tabloul $limbaje valoarea $cauta
$limita = count($limbaje);
for ($i = 0; $i < $limita; $i++) {
echo "<br />Determinarea unei identitati cu $limbaje[$i]";
if ($cauta == $limbaje[$i]) {
echo "<br />$cauta este un limbaj excelent.";
}
}
?>
Prima variabila $imbaje creeaza tabloul în care se va cauta.
Cea de-a doua instructiune atribuie valoarea "PHP" variabilei $cauta; (în exemplu, se cauta în tablou
valoarea stocata în variabila $cauta).
Dupa comentariu (care incepe cu //), urmatoarea instructiune obtine numarul elementelor din
tablou si stocheaza aceasta valoare în variabila $limita.
Instructiunea for functioneaza ca mai înainte; de data aceasta însa, corpul sau contine alte
instructiuni si se executa o alta operatie. O instructiune echo afiseaza valoarea fiecarui element al
tabloului pe masura ce iteratia (parcurgerea tabloului) avanseaza. Instructiunea if testeaza fiecare
element si afiseaza un mesaj daca valoarea elementului este una si aceeasi cu valoarea
variabilei $cauta.
Iata rezultatul rularii exemplului:
Determinarea unei identitati cu Perl
Determinarea unei identitati cu PHP
PHP este un limbaj excelent.
Determinarea unei identitati cu Python
- Instructiunea parcurge în mod iterativ (element cu element) tabloul denumit "tablou", stabilind
valori adecvate pentru valorile variabilelor "$cheie" si "$valoare" aferente fiecarui element al
tabloului.
Iata un exemplu simplu:
<?php
$limbajele = array(10=>"Perl", 20=>"PHP", 21=>"Python");
foreach ($limbaje as $index => $limbaj) { // parcurge iterativ tabloul
echo "<br />$index =>$limbaj";
}
?>
- Remarcati ca instructiunea echo face pur si simplu referire la valorile variabilelor $index si $limbaj,
carora li se atribuie în mod automat valorile cheii, respectiv elementului curent.
10 =>Perl
20 =>PHP
21 =>Python
3. Functi a key()
Functia key() este corelata cu functia current(). Daca functia current() returneaza valoarea
asociata elementului curent, functia key() returneaza cheia asociata elementului curent.
Iata un exemplu care ilustreaza modul de operare al acestei functii:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
$curent = current($limbaje);
$cheie = key($limbaje);
4. Functi a each()
O alta functie utila în parcurgerea tablourilor este each().
Functia each() returneaza perechea "cheie-valoare" care se afla la pozitia curenta din
tabloul specificat. Perechea "cheie-valoare" este returnata sub forma unui tablou
asociativ cu patru elemente, dupa cum urmeaza:
Cheie Valoare
0 - Componenta cheie a perechii cheie-valoare curenta
1 - Componenta valoare a perechii cheie-valoare curenta
key - Componenta cheie a perechii cheie-valoare curenta
value - Componenta valoare a perechii cheie-valoare curenta
- Observati ca puteti folosi valoarea cheie "0" sau "key" pentru a obtine accesul la componenta cheie
a perechii "cheie-valoare"; similar, puteti folosi valoarea cheie "1" sau "value" pentru a obtine
accesul la componenta valoare a perechii "cheie-valoare".
Pentru a intelege mai bine cum se foloseste functia each(), studiati exemplul urmator:
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
$fiecare = each($limbaje);
$zero = $fiecare[0];
$unu = $fiecare[1];
$cheie = $fiecare['key’];
$valoare = $fiecare['value’];
5. Functi a list()
O alta functie utila în lucrul cu tablouri este functia list(), aceasta va permite sa atribuiti valori la
numeroase variabile în cadrul unei instructiuni.
Functia list() este deseori folosita cu functia each(), deoarece functia list() faciliteaza accesul
separat la cheia si la valoarea returnate de functia each().
Forma generala de utilizare a functiei list() este urmatoarea:
list($var1, $var2, ..…, $varn) = valoare_tablou;
Fiecare dintre variabilele specificate, de la $var1 la $varn, primeste o valoare din tabloul
"valoare_tablou".
Într-un fel, functia list() este opusa functiei array(), deoarece functia list() împarte un tablou într-o
serie de valori scalare, în timp ce functia array() construieste un tablou dintr-o serie de valori
scalare.
Iata un exemplu care ilustreaza modul de utilizare a functiei list():
<?php
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
list($cheie, $valoare) = each($limbaje);
echo "<br />cheie = $cheie, valoare = $valoare";
$urmator = next($limbaje);
echo "<br />urmator = $urmator";
?>
Iata datele de iesire ale exemplului:
cheie = 10, valoare = Perl
urmator = Python
PHP contine peste 40 de functii pentru lucrul cu tablourile. De exemplu,
functia array_search() faciliteaza cautarea într-un tablou.
Pentru informatii despre aceasta functie si despre alte functii utilizate în lucrul cu tablouri, vizitati site-
ul www.php.net.
6. Sortarea tablourilor
Sortarea reprezinta o alta operatie frecvent aplicata tablourilor. PHP furnizeaza o suita de
functii care faciliteaza sortarea unui tablou.
De exemplu, un tablou poate fi creat dupa cum urmeaza:
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
Apoi, doriti sa sortati tabloul în ordine alfabetica, in functie de numele limbajului de programare.
Pentru aceasta, pur si simplu invocati functia sort():
sort($limbaje);
Dupa sortare, continutul tabloului apare in ordinea cum se poate vedea mai jos:
0 => PHP
1 => Perl
2 => Python
Observati ca secventa de sortare sau secventa de aranjare (cum este numita uneori) este sensibila la
diferenta între majuscule si minuscule. Deoarece litera "H" mare este sortata inaintea literei "e" mic,
PHP apare înainte de Python în datele de iesire sortate.
Iata un exemplu practic de folosire a functiei sort() :
<?php
$arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan');
sort($arr);
foreach($arr as $key=>$nume) {
echo "<br />Cheie=$key Valoare=$nume";
}
?>
Rezultatul afisat este urmatorul :
Cheie=0 Valoare=Avram
Cheie=1 Valoare=Cristian
Cheie=2 Valoare=Dan
Cheie=3 Valoare=Popescu
- Se observa ca instructiunea sort($arr) sorteaza matricea $arr dupa campul valoare (oridine
alfabetica).
- Observam de asemenea ca valorile campului cheie a fost alterata, fara sa conteze valoarea sau
ordinea cheilor.
Pentru a sorta matricea "$arr" pastrand corelarea initiala dintre valori si cheile corespunzatoare se
folosesc functiileasort(), respectiv arsort(). Incercati-le singuri.
In afara de acestea mai sunt si alte functii utile pentru sortarea tablourilor.
Iata un tabel care prezinta functiile folositoare pentru sortarea unui tablou, impreuna cu rezultatul
aplicarii fiecarei functii.
Vom lua ca model pentru exemplificare urmatoarea matrice:
$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
Functia strcmpcase() este o functie din biblioteca PHP care compara doua siruri fara a tine cont de
majuscule sau minuscule. Functia returneaza o valoare negativa daca primul sir este mai mic decât al
doilea, zero daca sirurile sunt identice, respectiv o valoare pozitiva daca primul sir este mai mare
decât al doilea.
Rezultatul va fi :
0 => Perl
1 => PHP
2 => Python
Pentru mai multe informatii despre functia usort() si despre functiile sale conexe, examinati site-
ul www.php.net
- In loc de spatiul dintre (" "), ca indiciu de separare, poate fi scris orice caracter; dupa cum se doreste
impartirea sirului.
Iata un exemplu:
<?php
$sir = "Popescu Avram Cristian Dan";
$matrice = explode(" ",$sir);
foreach($matrice as $key=>$nume) {
echo "<br />Cheie = $key Valoare = $nume";
}
?>
Acest cod va produce urmatorul rezultat:
Cheie = 0 Valoare = Popescu
Cheie = 1 Valoare = Avram
Cheie = 2 Valoare = Cristian
Cheie = 3 Valoare = Dan
Pentru a transforma o matrice intr-un sir, folosim functia implode(). Sintaxa aceste functii este:
$sir = implode(" ", $matrice);
- In loc de spatiul dintre (" "), ca semn de separare a elementelor in sir, poate fi scris orice caracter;
dupa cum se doreste crearea sirului.
In continuare, pentru exemplificare, folosind exemplul de mai sus, sortam matricea "$matrice"
alfabetic si apoi transferam matricea intr-un alt sir , de aceasta data sortat (Observati folosirea
caracterelor ( \" ) in expresia echo, pentru ca la iesire rezultatul sa contina ghilimele):
<?php
$matrice = array("Popescu", "Avram", "Cristian", "Dan");
sort($matrice);
$sir = implode(" - ",$matrice);
echo "<br />Sirul rezultat : \"$sir\"";
?>
Acest cod va produce urmatorul rezultat:
Sirul rezultat : "Avram - Cristian - Dan - Popescu"
Utilizarea functiilor
Am folosit pana acum de mai multe ori termenul de functii. In cadrul acestei lectii veti învata
mai multe despre utilizarea functiilor si despre modul de definire a propriilor dumneavoastra
functii.
Functiile reprezinta secvente de cod care sunt apelate foarte frecvent in cadrul codului PHP.
Folosirea intensiva a functiilor contribuie la o structurare mai buna a codului; ideea este ca o
problema complexa sa o divizam in mai multe sub-probleme, fiecare astfel de subproblema sa fie
executata in cadrul unei functii.
Pe de alta parte folosirea frecventa a functiilor duce la micsorarea cantitatii de cod scris; prin
urmare vom avea un cod care se executa mai eficient.
Majoritatea functiilor preiau argumente, reprezentând valori, de intrare care influenteaza operarea
si rezultatul functiei.
Pentru a specifica argumente, acestea se insereaza între paranteze; daca specificati mai mult de un
argument, fiecare argument trebuie separat de vecinul sau printr-o virgula.
Argumentul unei functii poate fi o valoare literala, o variabila sau o expresie.
Unele functii PHP au argumente optionale, care pot fi specificate sau omise, în conformitate cu
intentiile dumneavoastra. De exemplu, functia rand() are doua argumente optionale. Primul
argument al functiei indica valoarea întreaga aleatoare cea mai mica pe care o va returna functia; al
doilea argument indica valoarea cea mai mare. Daca omiteti ambele argumente, functia returneaza o
valoare cuprinsa între 0 si cel mai mare rezultat posibil.
Puteti folosi valoarea returnata de o functie într-o expresie, astfel valoarea va fi accesibila în mod
repetat fara a se invoca functia de mai multe ori
Iata un exemplu in care functia rand() returneaza o valoare aleatoare cuprinsa intre 1 si 500,
atribuind valoarea unnei variabile "$nr" :
$nr = rand(1, 500);
echo $nr;
Când se produce o eroare în timpul executiei unei functii, PHP genereaza mesaje de eroare. Uneori,
asemenea mesaje de eroare sunt nedorite. În acest caz, puteti suprima generarea mesajelor de
eroare prin adaugarea in fata numelui functiei a caracterului @.
De exemplu,, pentru a suprima mesajele de eroare care pot aparea în timpul executiei functiei "f()",
scriem aceasta functie dupa cum urmeaza:
y = @f(x);
Totusi, indicat este sa scrieti scripturi care sa nu genereze erori, ascunderea lor nu rezolva problema
ce cauzeaza eroarea.
O functie utila, recomandata a fi folosita in script-uri este functia isset() si este cel mai des
folosita cu "if()".
isset() preia ca argument de obicei o variabila si arata daca aceasta a fost sau nu setata.
De exemplu: isset($nr)
- Functia returneaza TRUE daca variabila "$nr" are setata o valoare (diferita de NULL), in caz contrar
returneaza FALSE.
Aceasta functie este foarte utila in determinarea caror comenzi sa fie executate in functie daca o
anumita variabila a fost setata sau nu. Previne aparitia unor erori care apar in cazuri de variabile nule
si ajuta si la securitate.
De exemplu, sa presupunem ca avem un cod PHP care vrem sa fie executat numai daca prin adresa
URL o fost transmisa o variabila "id", adica o adresa de forma http://www.domeniu.site/script.php?
id=un_id, folosim functia isset() astfel:
<?php
if (isset($_GET['id'])) {
// Se executa codul dorit
}
?>
- $_GET['id'] preia valoarea lui "id" din URL, iar functia isset() verifica daca aceasta valoare exista
(daca in URL este "id=ceva"). Daca aceasta exista, returneaza TRUE iar functia "if", avand astfel
valoarea TRUE, va executa codul dintre acoladele ei.
Functia isset() este utila si pentru situatii de verificarii a inexistentei unei variabile, prin adaugarea
caracterului (!) in fata ei. Astfel daca o anumita variabila rezulta a nu fi setata, ii atribuim o valoare sau
executam un anume cod special pt. asta.
Exemplu:
if (!isset($_GET['id'] {
die('Pagina apelata este inaccesibila.');
}
Când este încarcat un script PHP care contine o instructiune require, continutul fisierului specificat
este inserat si executat în script, înlocuind instructiunea require.
De exemplu, sa presupunem ca realizam un site in PHP care este alcatuita din mai multe pagini, iar
fiecare pagina contine in partea de sus acelasi cod HTML. In loc sa scriem de fiecare data, pentru
fiecare pagina, acelasi cod HTML, il scriem o singura data intr-un fisier separat (de exemplu
"antet.php") iar in paginile unde vrem sa fie inclus codul HTML folosim functia require()
Prin insertia instructiunii la începutul scriptului din fiecare pagina PHP, ca in exemplu urmator:
<?php
require("antet.php");
?>
- cu aceasta determinati programul PHP sa includa continutul fisierului "antet.php" ca si cum
continutul respectiv ar face parte din acel script.
Acest procedeu poate simplifica întretinerea site-ului, deoarece informatiile standard pot fi tinute
într-un singur fisier, ceea ce le face usor de localizat si de modificat.
O alta functie, similara instructiunii require este functia include(). Spre deosebire de
functia require() care introduce datele din fisierul extern intocmai cum sunt scrise,
functia include() este o instructiune executabila ce determina evaluarea scriptului PHP din fisierul
extern si codul acestuia este executat ca si cum ar fi aparut în textul scriptului unde este inclus.
Sintaxa functiei include() este urmatoarea:
include("nume_fisier.php");
Functia corelata require_once() asigura faptul ca fisierul specificat este inclus o singura data într-
un script dat. În cazul în care creati fisiere externe care si ele folosesc instructiunea require pentru a
include continutul altor fisiere externe, puteti gasi instructiunea require_once utila.
3. Defi nirea unei functi i
În afara de a utiliza functiile din biblioteca de functii a limbajului PHP, va puteti defini si folosi
propriile functii.
Pentru a defini o functie, in PHP functiile incep intotdeauna cu declaratia: function, ca in exemplul
urmator:
function nume_functie(nume_argument) {
Aici se insereaza corpul functiei
}
6. Functi i recursive
Este posibil ca o functie din PHP sa se auto-apeleze. O functie care procedeaza astfel se
numeste "functie recursiva". Totusi, daca nu aveti experienta de programare, este recomandat sa
nu scrieti functii recursive. Cu toate acestea, puteti scrie accidental sau intalni o asemenea functie,
deci este util sa stiti unele notiuni referitoare la aceasta.
Studiati scriptul urmator care defineste si invoca o functie recursiva simpla:
<?php
function recursor($nr) {
$nr++;
if ($nr<8) {
return recursor($nr);
}
return $nr;
}
$x = recursor(3);
echo $x;
?>
- Daca rulati acest script, rezultatul afisat va fi 8.
- Variabila "$x" primeste ca valoare functia "recursor()" careia ii transmite ca argument numarul 3.
- Functia "recursor()" incrementeaza cu o unitate valoarea argumentului, prin "$nr++;" care devine 4,
apoi conditia "if ($nr<8)" verifica daca aceasta variabila din functie e mai mica decat 8, in caz
afirmativ se executa comanda "return recursor($nr);" care sisteaza executia altui cod din functie si
auto-apeleaza iar functia (cu noua valoare a lui "$nr" ca argument) care iar incrementeaza valoarea
lui "$nr" si verifica din nou conditia care iar autoapeleaza functia, ... si tot asa pana cand "$nr" va
avea valoarea 8 si la verificare conditiei "if" aceasta returneaza FALSE si se trece mai departe la
executia comenzii "return $nr;" care va returna 8 ca valoare a variabilei "$x".
Functia "echo" va afisa valoarea lui "$x", adica 8.
7. Defi nirea argumentelor prestabilite
PHP va permite sa definiti functii cu argumente prestabilite. Daca apelati o functie care are un
argument prestabilit, dar nu furnizati nici o valoare pentru argumentul respectiv, argumentul ia o
valoare prestabilita specificata la inceput.
Iata un exemplu simplu, studiati-l cu atentie:
<?php
function impozit_vanzari($cantitate, $rata = 0.0725) {
return $cantitate * $rata;
}
$cumparaturi = 123.45;
echo "<br />cumparaturi = $cumparaturi";
$impozit1 = impozit_vanzari($cumparaturi, 0.09);
echo "<br />impozit1 = $impozit1";
$cumparaturi = 123.45;
echo "<br /><br />cumparaturi = $cumparaturi";
$impozit2 = impozit_vanzari($cumparaturi);
echo "<br />impozit2 = $impozit2";
?>
Rezultatu afisat va fi:
cumparaturi = 123.45
impozit1 = 11.1105
cumparaturi = 123.45
impozit2 = 8.950125
Functia impozit_vanzari preia doua argumente: un argument obligatoriu, denumit $cantitate, si un
argument prestabilit, denumit $rata.
Daca apelati functia si furnizati un singur argument, valoarea argumentului respectiv se considera ca
fiind valoarea argumentului $cantitate, iar valoarea 0.0725 se foloseste ca valoare a argumentului
$rata. Astfel, la prima invocare a functiei, pentru "impozit1", $rata are valoarea 0.09, specificata
drept al doilea argument al functiei. Cu toate acestea, la a doua invocare a functiei, pentru
"impozit2", $rata are valoarea 0.0725 deoarece este specificata valoarea unui singur argument, si
astfel "$rata" a preluat valoarea prestabilita initial.
Variabilele globale sunt create în exteriorul functiei, în timp ce variabilele locale sunt create în
interiorul unei functii.
1. Uti lizarea variabilelor globale
Asa cum s-a explicat anterior, variabilele globale sunt cele declarate în afara oricarei functii.
Totalitatea locurilor unde este accesibila o variabila se numeste "domeniu de existenta al
variabilei". Variabilele globale nu pot fi accesibile din interiorul corpului unei functii; cu alte
cuvinte, domeniul de existenta al unei variabile globale, nu include corpurile functiilor. Daca doriti
sa obtineti accesul la o variabila globala în cadrul unei functii, puteti extinde domeniul de existenta
al variabilei prin specificarea in functie a numelui variabilei, în cadrul unei instructiuni GLOBAL.
Instructiunea GLOBAL are urmatoarea forma:
GLOBAL variabila1, variabila2, variabila3;
O alta metoda prin care putem solutiona aceasta problema este prin folosirea variabilei PHP
predefinite $GLOBALS, dupa cum puteti vedea in exemplu urmator:
<?php
$var1 = 135;
$var2 = 250;
function Suma() {
return $GLOBALS['var1'] + $GLOBALS['var2'];
}
echo "Suma este ". Suma();
?>
$GLOBALS este o variabila predefinita, este de fapt un array ; elementele acestei matrice au cheia
egala cu numele variabilelor declarate si valoarea egala cu cea a variabilelor declarate.
$GLOBALS este o variabila superglobala, ea va fi recunoscuta in orice script.
Puteti folosi oricare din cele doua variante prezentate: instrucrtiunea GLOBAL sau
variabila $GLOBALS.
In cele doua exemple prezentate mai sus rezultatul afisat va fi acelasi :
Suma este 385
O variabila afisata într-o instructiune STATIC este cunoscuta sub numele de "variabila statica".
Iata un exemplu care prezinta modul de utilizare a unei variabile statice:
<?php
function v_local() {
$x = $x + 1;
echo "<br /> x = $x";
}
function v_static() {
STATIC $x;
$x = $x + 1;
echo "<br /> x = $x";
}
v_local();
v_local();
v_local();
v_static();
v_static();
v_static();
?>
Daca rulati acest script, veti primi urmatoarele rezultate:
x=1
x=1
x=1
x=1
x=2
x=3
Observati ca variabila locala $x, definita în cadrul functiei v_local(), este creata din nou la fiecare
apelare a functiei, în consecinta, valoarea sa este întotdeauna afisata ca fiind egala cu 1.
Prin contrast, variabila statica $x, definita în cadrul functiei v_static(), îsi pastreaza valoarea de la un
apel al functiei la urmatorul; ca atare, valoarea sa creste de fiecare data când este executata functia.
$b = 0;
p_valoare($b);
echo "<br /> \$b = $b";
$b = 0;
p_valoare(&$b);
echo "<br /> \$b = $b";
$b = 0;
p_referinta($b);
echo "<br /> \$b = $b";
?>
Dupa rulati acest script, veti obtine urmatoarele date de iesire:
$b = 0
$b = 1
$b = 1
Retineti ca scriptul contine doua functii, si anume "p_valoare()" si "p_referinta()". Fiecare functie
preia un singur argument, denumit $a. Antetul functiei "p_referinta()" specifica faptul ca argumentul
sau este transferat prin referinta; argumentul functiei "p_valoare()" este transferat prin valoare.
Primul paragraf al programului invoca functia "p_valoare()", transferând argumentul prin valoare. În
consecinta, functia lucreaza cu o copie a argumentului sau, iar valoarea variabilei $b nu se modifica.
Cel de-al doilea paragraf al programului invoca de asemenea functia "p_valoare()"; dar, foloseste un
caracter ampersand (&) pentru a determina transferul prin referinta al valorii variabilei $b. În
consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 în 1.
Cel de-a treilea paragraf al programului invoca functia "p_referinta()". Antetul functiei respective
foloseste un caracter ampersand (&) pentru a specifica faptul ca valoarea argumentului sau este
transferata prin referinta, în consecinta, functia modifica valoarea argumentului sau, care se
transforma din 0 în l.
Prin utilizarea referintelor se evita suprasarcina de copiere a valorilor argumentelor si implicit se
obtine o viteza mai mare de executie a programului. Cu toate acestea, programele devin astfel mai
dificil de înteles, iar referintele sau apelurile prin referinta pot cauza erori de program. Cel mai indicat
este sa evitati referintele, acolo unde este posibil, si sa definiti functii care returneaza valori, si nu functii
care modifica valorile propriilor argumente.
In versiunile PHP 5+, transmiterea la functiei a unui parametru prin referinta "Call-time pass-by-
reference",p_valoare(&$b), a fost scoasa din uz. Dar poate fi activata din php.ini, daca aveti acces, prin
setarea 'true' la "allow_call_time_pass_reference".
În Lectia 2 au fost prezentate sirurile, tipul de date PHP care stocheaza texte, în aceasta lectie
veti învata mai multe despre utilizarea sirurilor.
Sirul de formatare consta dintr-o serie de caractere si directive ordinare. Un caracter ordinar este
orice caracter, în afara caracterului "%". Caracterele ordinare sunt pur si simplu copiate la iesire.
Directivele reprezinta secvente de caractere care încep cu simbolul "%"; aceste determina modul în
care va fi formatat argumentul corespunzator.
O directiva simpla, cum este cea din exemplul precedent, poate consta dintr-un caracter "%" urmat
de un specificator de tip, precum "d", care arata ca argumentul trebuie tratat ca numar zecimal. Cu
toate acestea, o directiva mai sofisticata poate include urmatoarele componente, care trebuie sa
apara în ordinea indicata:
Specificator de completare (optional): - Un specificator de completare precizeaza caracterul
care se va folosi pentru a completa rezultatul pâna la dimensiunea ceruta a sirului, în
cazul în care caracterul de completare este omis, rezultatul este completat cu spatii.
Specificatorul de completare poate fi un caracter spatiu sau un 0 (zero). Un specificator
de completare de tip spatiu este folosit frecvent cu sirurile, iar un specificator de
completare zero se foloseste mai ales alaturi de numere. Un alt caracter de completare
poate fi specificat prin prefixarea acestuia cu un singur semn al citarii ('). De exemplu,
pentru a completa un rezultat cu liniute de subliniere, specificati '_ drept caracter de
completare.
Specificator de aliniere (optional): - Un specificator de aliniere indica daca rezultatul trebuie
sa fie aliniat la stânga sau la dreapta. Daca specificatorul de aliniere este omis, rezultatul
va fi aliniat la dreapta; daca se indica o cratima (-) drept specificator de aliniere, rezultatul
va fi aliniat la stânga.
Specificator de latime (optional): - Un specificator de latime este un întreg care determina
numarul minim de caractere ale rezultatului; sau, daca argumentul este de tip double,
numarul minim de caractere situate la stânga punctului zecimal. Daca rezultatul contine
un numar mai redus de caractere, atunci va contine si caractere de completare.
Specificator de precizie (optional): - Un specificator de precizie este un punct zecimal, urmat
de un întreg care determina numarul de cifre dupa punctul zecimal pe care trebuie sa le
contina rezultatul. Specificatorul de precizie nu are nici un efect pentru alte tipuri decât
double (float).
Specificator de tip (obligatoriu): - Specificatorul de tip determina modul de tratare si afisare
a argumentului.
2. Compararea sirurilor
PHP furnizeaza patru functii care sunt deosebit de utile pentru compararea sirurilor. Aceste
functii sunt enumerate în tabelul urmator.
Fiecare functie returneaza o valoare al carei semn determina rezultatul comparatiei; nu
trebuie sa încercati sa interpretati valoarea returnata efectiva.
Functii PHP de comparatie între siruri
Functia Descriere
- Executa o comparatie fara sensibilitate la diferenta între majuscule si
minuscule. Returneaza o valoare mai mica decât zero daca 's1' este mai
strcasecmp(s1, s2)
mic decât 's2', o valoare mai mare decât zero daca 's1' este mai mare
decât 's2', respectiv 0 în celelalte cazuri.
- Executa o comparatie cu sensibilitate la diferenta între majuscule si
minuscule. Returneaza o valoare mai mica decât zero daca 's1' este mai
strcmp(s1, s2)
mic decât 's2', o valoare mai mare decât zero daca 's1' este mai mare
decât 's2', respectiv 0 în celelalte cazuri.
strncasecmp(s1, s2, n) - Executa o comparatie fara sensibilitate la diferenta între majuscule si
minuscule. La comparatie sunt luate în considerare un numar de 'n'
caractere. Returneaza o valoare mai mica decât zero daca 's1' este mai
mic decât 's2', o valoare mai mare decât zero daca 's1' este mai mare
decât 's2', respectiv 0 în celelalte cazuri.
- Executa o comparatie cu sensibilitate la diferenta între majuscule si
minuscule. La com paratie sunt luate în considerare un numar de 'n'
strncmp(s1,s2, n) caractere. Returneaza o valoare mai mica decât zero daca 's1' este mai
mic decât 's2', o valoare mai mare decât zero daca 's1' este mai mare
decât 's2', respectiv 0 în celelalte cazuri.
Iata un scurt exemplu care prezinta modul de utilizare a acestor functii:
<?php
$s1 = "abcd";
$s2 = "ABCE";
$rezultat = strcasecmp($s1, $s2);
echo "<br /> Functia strcasecmp a returnat $rezultat";
$rezultat = strcmp($s1, $s2);
echo "<br /> Functia strcmp a returnat $rezultat";
$rezultat = strncasecmp($s1, $s2, 3);
echo "<br /> Functia strncasecmp returnat $rezultat";
$rezultat = strncmp($s1, $s2, 3);
echo "<br /> Functia strncmp a returnat $rezultat";
?>
Scriptul de mai sus va afisa:
Functia strcasecmp a returnat -1
Functia strcmp a returnat 1
Functia strncasecmp returnat 0
Functia strncmp a returnat 1
Datele de iesire va arata ca functia strcasecmp() a identificat sirul "abcd" ca fiind mai mic decât
"ABCE", in schimb, functia strcmp(), la fel ca si functia strncmp(), a identificat sirul "abcd" ca fiind mai
mare decât "ABCE". Aceasta s-a întâmplat deoarece literele minuscule au în secventa ASCII o pozitie
superioara literelor scrise cu majuscule; litera 'A' are valoarea ASCII 65, iar litera 'a' are valoarea ASCII
97.
De asemenea, datele de iesire arata ca functia strncasecmp() a identificat sirul "s1" ca egal cu "s2",
deoarece au fost luate in considerare numai primele 3 caractere.
$cauta = "cat";
$inlocuire = "DOG";
$rezultat = str_replace($cauta, $inlocuire, $subiect);
echo "<br /> str_replace : $rezultat";
$inlocuire = "CAT";
$rezultat = substr_replace($subiect, $inlocuire, 4, 3);
echo "<br /> substr_replace : $rezultat";
?>
Iata si rezultatul exemplului :
Subiect : the cat on the mat near the bat
str_replace : the DOG on the mat near the bat
substr_replace : the CAT on the mat near the bat
Sa presupunem ca doriti sa specificati un sir care poate include orice vocala. Puteti face aceasta
folosind expresia regulata [aeiou]. Prin includerea valorilor posibile între paranteze, formati o
expresie regulata echivalenta cu formularea "alege oricare din aceste valori". Daca doriti sa
permiteti si utilizarea, majusculelor, puteti scrie[aeiouAEIOU].
Sa presupunem ca doriti sa specificati un sir care poate include orice caracter scris cu minuscule.
Puteti scrie:[abcdefghijklmnopqrstuvwxyz]. Sau puteti folosi o forma mai compacta [a-z], unde
prin cratima se întelege "o serie de caractere consecutive".
Sa presupunem ca doriti sa specificati intr-o expresie regulata sirurile "sat", "mat" si "lat". Pentru
aceasta, aveti nevoie de expresia regulata [sml]at. Semnificatia acestei expresii regulate este
urmatoarea: "alege oricare din literele 's', 'm' si 'l' si scrie dupa litera respectiva literele 'at'".
Daca un accent circumflex (^) este primul simbol mentionat între parantezele drepte, acesta are ca
efect inversarea semnificatiei expresiei regulate plasate între paranteze.
De exemplu, expresia regulata [^a-z] corespunde oricarui caracter care nu este o litera mica.
Pentru a specifica faptul ca o expresie regulata se poate repeta, expresia regulat va fi urmata de
o pereche de acolade, care includ limitele superioara si inferioara ale repetitiei.
De exemplu, expresia regulata [aeiou]{1,4} corespunde sirurilor care pot contine intre 1 si 4
vocale.
Pentru a specifica repetarea mai multor parti ale unei expresii regulate, includeti partile
respective între paranteze rotunde.
De exemplu, expresia regulata ([sml]at){1 ,2} corespunde unui numar de una sau doua
repetari ale oricaruia dintre sirurile "sat", "mat" sau "lat".
Pentru a simplifica scrierea de reguli intr-o expresie regulata se folosesc anumite caractere
"speciale"
Sa presupunem ca doriti sa reprezentati o înmultire intre doua numere, puteti obtine ceva de
genul [0-9]*[0-9]. Totusi, aceasta expresie regulata nu are semnificatia dorita, deoarece '*' este un
factor de repetitie, nu un caracter dintr-un sir. Pentru a dezactiva semnificatia speciala a
caracterului '*', trebuie sa-l prefixati cu un caracter backslash: [0-9]\*[0-9].
Pentru a specifica faptul ca o expresie regulata corespunde numai unui sub-sir care include
anumite caractere la inceput, prefixati expresia regulata cu un accent circumflex "^". De exemplu,
expresia regulata ^[sml]at corespunde sub-sirurilor "sat", "mat" sau "lat" numai daca acestea apar
la începutul sirului subiect.
Similar, pentru a arata ca o expresie regulata corespunde numai unui sub-sir care include anumite
caractere la sfarsit, anexati la expresia regulata un simbol al dolarului "$". De exemplu, expresia
regulata [sml]at$ corespunde sirurilor "sat", "mat" sau "lat" numai daca acestea apar la sfârsitul
sirului subiect.
Iata o lista cu mai multe caractere speciale si rolul lor in expresiile regulate:
^ - indica inceputul liniei
$ - indica sfarsitul liniei
. - (punct) orice caracter
[] - un caracter dintre cele din paranezele patrate
[^] - orice caracter, in afara celor din paranezele patrate
\ - scoate din contextul formari expresiei caracterul care urmeaza
+ - caracterul (expresia) anterior acestui semn se poate repeta odata si de cate ori e posibil
(de la 1 la infinit)
* - caracterul (expresia) anterior acestui semn se poate repeta de cate ori e posibil sau
niciodate (de la 0 la infinit)
? - caracterul (expresia) anterior acestui semn se poate repeta ce mult odata
<> - un cuvant intreg
(|) - lista de optiuni SAU
{m, n} - repetarea expresiei de la "m" la "n" ori
- Iata un exemplu:
<?php
$model = "[sml]at";
$subiect = "La noi in sat";
$rezultat = ereg($model, $subiect);
if ($rezultat) {
echo 'Model inclus in subiect';
}
?>
- In acest script, variabila $rezultat primeste valoarea TRUE, deoarece sirul 'subiect' contine sub-sirul
"sat", care corespunde expresiei regulate.
Pentru verificare, instructiunea "if" verifica daca "$resultat" este TRUE si in caz afirmativ executa
comanda dintre acolade, "echo" care afiseaza 'Model inclus in subiect'.
- Pentru a verifica daca un sir contine numai litere si numere, puteti folosi direct
functia ctype_alnum()
- Deoarece functiile "ereg" au fost deprecate incepand cu versiunea PHP 5.3 si anulate din PHP 6,
este indicat sa nu le mai folositi, cunoasterea lor e necesara daca le intalniti in scripturi mai vechi.
Acestea au fost inlocuite cu functii "preg_" (Perl-Compatible). Mai multe detalii si exemple despre
aceste functii gasiti in manualul Expresii regulate (compatibile Perl.
Expresiile regulate compatigile Perl se adauga intre caractere "/". De exemplu sablonul ([a-z0-9]+) se
foloseste /([a-z0-9]+)/.
Iata un exemplu cu preg_grep(), aceasta returneaza un array compus din elementele unei matrice
care contin sablonul, expresia regulata cautata. Acest exemplu va returna doar acele elementele
dintr-o matrice care contin in ele sub-sirurile "casa" sau "masa".
<?php
$matrice = array('123casa', 'abc masa', '12-xy', '$asa_0/', '123abc casa');
$filtru = preg_grep("/([cm]asa)/", $matrice);
- Argumentul 'numeCookie' specifica numele variabilei cookie, iar argumentul 'valoare' specifica
valoarea variabilei.
- Valoarea variabilei cookie este automat transmisa "urlencode" si cand este primita e automat
decodata.
- Argumentul 'expirare' indica momentul expirarii variabilei cookie; dupa ora specificata, variabila
cookie nu mai este accesibila.
În general, este convenabil sa se specifice momentul expirarii folosind functia time(), care returneaza
intervalul de timp (exprimat în secunde) scurs de la 1 ianuarie 1970. Puteti adauga o valoare de tip
decalaj (offset), care specifica intervalul de timp pe durata caruia variabila cookie trebuie sa fie
accesibila.
Folosind aceasta functie se pot transmite mai multe cookie-uri succesiv; protocoalele Web limiteaza
insa la maximum 20 numarul cookie-urilor ce pot fi trimise aceluiasi utilizator.
De exemplu, sa luam în considerare urmatoarea instructiune:
setcookie("fruct", "banana", time()+3600);
Aceasta instructiune creeaza o variabila cookie denumita 'fruct', care are valoarea 'banana'. Variabila
cookie va fi disponibila timp de o ora (3600 secunde) de la crearea sa.
Daca preferati, puteti specifica momentul expirarii folosind functia mktime(). Aceasta functie are
urmatoarea forma:
mktime(ore, minute, secunde, luna, zi, an)
De exemplu, urmatoarea instructiune creeaza o variabila cookie care expira la o secunda dupa miezul
noptii primei zile a anului 2009:
Setcookie("fruct", "banana", mktime(0, 0, 1, 1, 1, 2009));
$result = file_exists($filename);
echo "<br /> file_exists(): $result";
$result = fileowner($filename);
echo "<br /> fileowner(): $result";
$result = filegroup($filename);
echo "<br /> filegroup(): $result";
$result = filetype($filename);
echo "<br /> filetype(): $result";
$result = filesize($filename);
echo "<br /> filesize(): $result";
$result = fileatime($filename);
$result = date("m/d/Y H:i", $result);
echo "<br /> fileatime(): $result";
$result = filectime($filename);
$result = date("m/d/Y H:i", $result);
echo "<br /> filectime(): $result";
$result = filemtime($filename);
$result = date("m/d/Y H:i", $result);
echo "<br /> filemtime(): $result";
$result = fileperms($filename);
$result = decoct($result);
echo "<br /> fileperms(): $result";
$result = is_file($filename);
echo "<br /> is_file(): $result";
$result = is_dir($filename);
echo "<br /> is_dir(): $result";
$result = is_readable($filename);
echo "<br /> is_readable(): $result";
$result = is_writable($filename);
echo "<br /> is_writable(): $result";
?>
Datele de iesire ale exemplului sunt urmatoarele
file_exists(): 1
fileowner(): 0
filegroup(): 0
filetype(): file
filesize(): 5
fileatime(): 08/28/2008 00:00
filectime(): 08/28/2008 10:49
filemtime(): 08/28/2008 11:32
fileperms(): 100666
is_file(): 1
is_dir():
is_readable(): 1
is_writable(): 1
2. Privilegii de fi sier
Privilegiile asociate unui fisier (sau director) determina operatiile pe care utilizatorii le pot
efectua cu fisierul (sau directorul) respectiv. =
Privilegiile sunt date sub forma a trei grupuri alcatuite din câte trei caractere fiecare; cu alte
cuvinte, trei triade. Prima triada indica privilegiile acordate posesorului fisierului. Cea de-a doua
triada indica privilegiile acordate membrilor grupului posesor al fisierului. Cea de-a treia triada
indica privilegiile acordate altor utilizatori.
Cele 3 caractere care alcatuiesc un grup sunt reprezentate, in sistemele UNIX, prin urmatoarele tri
litere: 'r', 'w' si 'x'; acestea reprezinta:
r - fisierul poate fi citit
w - se poate scrie în fisier
x - continutul fisierului poate fi executat
Caracterele unei triade apar întotdeauna în secventa 'rwx'. Daca o anumita litera este înlocuita de o
cratima (-), privilegiul asociat nu este accesibil.
De exemplu, sa examinam privilegiile specificate in urmatorul exemplu:
rwxr-xr--
Privilegiul 'x' este semnificativ numai pentru fisierele care includ un continut executabil, cum sunt
fisierele binare executabile (.exe) sau anumite categorii de scripturi.
Posesorul unui fisier poate modifica privilegiile asociate fisierului emitând
comanda chmod (aceasta functioneaza in sistemele de operare UNIX).
Aceasta comanda are doua forme. O forma va permite sa specificati privilegiile folosind cifre scrise
în octal; cealalta va permite sa le specificati folosind litere.
Pentru a specifica privilegiile folosind cifre în octal, calculati valoarea numerica a fiecarei triade.
Pentru aceasta, însumati numerele corespunzatoare fiecarui privilegiu disponibil din cadrul triadei.
Numerele asociate privilegiilor sunt urmatoarele:
r - 4
w - 2
x - 1
De exemplu, privilegiul "rwx" are valoarea 4 + 2 + 1 = 7. Similar, privilegiul "r-x" are valoarea 4 + l = 5,
iar privilegiul "r--" are valoarea 4.
Dupa ce ati calculat valoarea numerica a fiecarei triade, formati un numar din trei cifre scris în octal,
care este alcatuit din valoarea numerica a privilegiilor utilizatorilor, valoarea numerica a privilegiilor
membrilor grupului, si valoarea numerica a privilegiilor altor utilizatori. Astfel, privilegiile "rwxr-xr--"
corespund valorii în octal 754.
Argumentul 'nume_fisier' specifica numele si calea de acces a fisierului ale carui privilegii urmeaza a
fi modificate, iar argumentul 'mod' specifica privilegiile dorite, în general, se prefera exprimarea
privilegiilor sub forma unui numar scris în octal. Pentru aceasta, prefixati valoarea folosind cifra 0.
De exemplu, puteti atribui unui fisier "text.txt" privilegiile "rwxr-xr--" specificând pentru 'mod'
valoarea 0754, functia "chmod" va fi chmod("text.txt", 0754)
Pentru ca functia chmod() sa se execute cu succes, PHP trebuie sa ruleze sub contul utilizatorului
posesor al fisierului. Functia returneaza TRUE în caz de reusita, respectiv FALSE în caz contrar.
Pentru a modifica grupul posesor al unui fisier, invocari functia chgrp(), care are forma:
chgrp("nume_fifier", grup)
- Unde "grup" este un nume sau numar care desemneaza grupul respectiv.
Functiile chmod() si chgrp() nu functioneaza sub Microsoft Windows.
4. Deschiderea unui fi sier
Inainte de a putea citi sau scrie într-un fisier, trebuie sa deschideti fisierul folosind
functia fopen().
fopen("nume_fisier", "mod")
- unde 'nume_fisier' specifica numele si calea spre fisierul care urmeaza a fi deschis, iar 'mod' indica
tipul de acces dorit.
Modurile de deschidere a unui fisier sunt urmatoarele:
r - Permite doar citirea fisierului
r+ - Citire sau scriere de la inceputul fisierului
w - Creaza fisierul daca nu exista si suprascrie datele existente
w+ - Citire sau scriere; la scriere , creeaza fisierul daca nu exista si suprascrie datele
existente
a - Adaugare; Creaza fisierul daca nu exista si adauga datele noi la sfarsitul fisierului
existent
a+ - Citire sau scriere; la scriere, creaza fisierul daca nu exista si adauga datele noi la
sfarsitul fisierului existent
x - Doar scriere; Creaza fisierul daca nu exista si genereaza un averisment daca acesta
exista
x+ - Citire sau scriere; Creaza fisierul daca nu exista si genereaza un averisment daca
acesta exista
b - Deschide fisierul in mod binar
Functia fopen() returneaza FALSE daca PHP nu a reusit sa deschida fisierul, în caz contrar, returneaza
o valoare care contine un întreg, numit "identificator de fisier", care se foloseste pentru identificarea
unui fisier de catre functiile care executa operatii cu fisiere.
De exemplu, instructiunea urmatoare deschide fisierul 'carte.txt' pentru citire:
$fh = fopen("carte.txt", "r");
Sub Microsoft Windows, fisierele ASCII si fisierele binare sunt tratate în mod diferit. Când deschideti
un fisier binar sub Windows, specificati "b" ca al doilea caracter al modului; de exemplu, "rb" pentru
citire, "wb" pentru scriere, "a+b" pentru citire si adaugare. Daca nu procedati astfel, citirile din fisier
si alte operatii se vor încheia prematur sau vor esua.
O alta modalitate simpla de a citi linie cu linie un întreg fisier consta în a folosi functia file(). Aceasta
functie returneaza un tablou în care fiecare element contine o linie a fisierului specificat.
Iata un exemplu care foloseste functia file() pentru a citi si pentru a afisa continutul unui fisier:
<?php
$tablou = file("carte.txt");
foreach ($tablou as $s) {
echo "<br /> Citeste : $s";
}
?>
Aceasta metoda nu este adecvata pentru fisiere de foarte mari dimensiuni, deoarece în tablou este
încarcat întregul continut al fisierului, ceea ce poate necesita o cantitate de memorie superioara celei
disponibile.
Pentru a obtine valoarea curenta a pointerului de fisier, folositi functia ftell(), care are urmatoarea
forma:
ftell(identificator_fisier)
Functia returneaza valoarea curenta a identificatorului de fisier, respectiv valoarea zero daca functia
esueaza.
Iata cum se foloseste procesul de blocare, vom folosi acelasi exemplu, contoarul de mai sus, de
data aceasta imbunatatit.
<?php
$contor = "ctr.txt";
$fh = @fopen($contor, "r+b");
if (!$fh) {
echo "Nu a fost deschis fisierul ctr.txt.";
}
else {
flock($fh, LOCK_EX);
$s = fgets($fh, 7);
$count = (int) $s;
$count = $count + 1;
rewind($fh);
fwrite($fh, $count);
flock($fh, LOCK_UN);
echo "<br /> Nr. vizitari: $count"
fclose($fh);
}
?>
- De data aceasta scriptul blocheaza fisierul "ctr.txt" pe timpul citirii si scrierii acestuia, astfel încât
accesul simultan sa nu cauzeze o numarare eronata.
Blocare se face imediat dupa ce a fost deschis fisierul, cu "LOCK_EX", si se incheie imediat dupa
rescrierea in fisier, prin deblocare acestuia "LOCK_UN".
Cele mai importante functii pentru utilizarea cataloagelor va permit sa obtineti catalogul de
lucru si sa lucrati cu acesta, sa manipulati cai de acces, sa cititi continutul unui director, sa
vizualizati si sa modificati privilegiile unui director, precum si sa creati si sa stergeti cataloage.
In acest context, numele "catalog" si "director" reprezinta acelasi lucru.
Rezultatul apelarii functiei readdir() este un sir care contine numele urmatorului fisier sau sub-
director din catalogul deschis. Functia returneaza FALSE atunci când au fost citite toate intrarile din
catalog.
Iata un exemplu care prezinta modul de utilizare a acestor functii pentru citirea continutului unui
catalog:
<?php
$dc = @opendir("home/plomar/curs-php");
if (!$dc) {
echo "Directorul nu a putut fi deschis";
}
else {
while ($ok = readdir($dc)) {
echo "<br /> $ok";
}
closedir($dc);
}
?>
Datele de iesire ale exemplului pot fi similare cu cele prezentate mai jos :
style
imgs
lectia
scripts
index.php
- Sau puteti folosi functia scandir($dir). Aceasta preia intr-un Array numele tuturor directoarelor si
fisierelor din directorul "$dir". In caz de nereusita returneaza False.
Aceasta trebuie sa fie printre primele linii de cod dintr-un script PHP, deoarece apelul acestei functii
trebuie facut inainte de trimiterii catre browser-ul Web a vreunui cod HTML sau chiar a unui spatiu
vid.
Daca folosim stocarea iesirii in buffer, instructiunea session_start() nu trebuie inserata neaparat la
inceputul codului.
Instructiunea session_start() nu este necesare daca in fisierul de configurare "php.ini", variabila
"session.auto_start" are valoarea TRUE.
Pentru a intelege mai bine modul de lucru cu sesiuni si functia session_start(), folosim un exemplu in
care avem o pagina principala "a.php" unde cream o variabila cu numele "userName", atribuindu-i
valoarea "MarPlo", pe care o stocam intr-o sesiune PHP, pagina contine o legatura catre o alta pagina
"b.php", aceasta din urma va folosi functia session_start()pentru a prelua, prin sesiune, valoarea
variabilei "user_name" din pagina "a.php", astfel putem folosi valoarea acestei variabile intr-un script
din pagina "b.php".
Continutul fisierului "a.php" este urmatorul:
<?php
//Fisierul a.php
session_start();
if(!isset($_SESSION['userName']))
$_SESSION['userName'] = "MarPlo";
?>
//Fisierul b.php
session_start();
?>
<?php
echo "<br />Variabila de sesiune are valoarea: ". $_SESSION['userName'];
?>
</body>
</html>
Observati ca atribuirea, respectiv citirea variabilelor se face folosind variabila super-
globala : _SESSION.
Deschizand prima pagina, "a.php", va fi afisat urmatorul rezultat
Aceasta este pagina "a.php"
Variabila de sesiune are valoarea: MarPlo
Legatura spre pagina b.php
Cand apasam click pe link-ul "spre pagina b.php", se va deschide aceasta pagina, afisand urmatorul
continut:
Aceasta este pagina "b.php"
Variabila de sesiune are valoarea: MarPlo
- In acest exemplu se observa ca pagina "b.php" detine informatii despre variabila de sesiune creata
in pagina "a.php".
2. Manipularea variabilelor sesiunii.
In anumite momente ar putea fi util sa aflam identificatorul sesiunii curente. Pentru aceasta
folosim functiasession_id(), ca in exemplul urmator:
<?php
echo "<br /> Identificatorul sesiunii curente SID este:". session_id();
Iata cum se prezinta exemplul prezentat mai sus. (consideram o variabila "$passtest" care verifica
daca valoarea acesteia este egala cu parola):
<?php
$secret = 'abcgfd43599oopjhfdxcaqq30pmnvcx';
$parola = 'mypass';
$cod = md5($secret. $parola);
session_start();
$_SESSION['parola'] = $cod;
// Consideram variabila "$passtest" pentru a testa daca valoarea acesteia este egala cu parola
if (md5($secret. $passtest) == $_SESSION['parola'])
echo "Parola acceptata";
else
echo "Parola nu este valida";
?>
Astfel, daca valoarea variabilei "$passtest", care poate fi obtinuta de exemplu dintr-un formular
HTML, este identica cu parola pastrata de noi, va fi afisat mesajul "Parola acceptata".
Datele sesiunii sunt memorate in server in fisiere temporare. Pentru a sterge datele sesiunii din
server folositi:
session_destroy()
Aplicatia software care gazduieste o baza de date se numeste "sistem de gestiune a bazelor de date"
(SGBD). Exista multe sisteme de gestiune a bazelor de date, printre cele mai populare asemenea
sisteme se numara: DB2 , Interbase , MySQL , Oracle , Postgresql , SQL Server , Sybase .
MySQL este cel mai popular sistem de gestiune a bazelor de date destinat utilizarii cu PHP, în mare
masura deoarece este gratuit. Totusi, prin intermediul PHP este posibil accesul la aproape orice
SGBD modern.
Bazele de date relationale înteleg SQL (Structured Query Language), un limbaj relativ simplu, folosit
pentru solicitarea datelor. In ciuda simplitatii sale, SQL este un limbaj foarte puternic, care poate
obtine accesul la date stocate în mai multe tabele, poate filtra datele dorite si poate sorta, rezuma si
afisa rezultatele.
În general, bazele de date relationale îsi stocheaza datele într-un singur fisier sau catalog. Aceasta
caracteristica de organizare faciliteaza administrarea datelor, deoarece executarea copiei de
siguranta, respectiv restaurarea unui singur fisier sau catalog se realizeaza mai usor.
Sistemele de gestiune a bazelor de date relationale necesita mai multe cicluri de procesor pentru a
satisface o cerere de date decât cele necesare pentru accesul la un fisier normal, dar ofera protectie
sporita a datelor, iar pentru accesul la distanta usureaza traficul deoarece majoritatea operatiilor
sunt efectuate de programul SQL, astfel singurele date transmise in retea ar fi rezultatul cerut.
Tabelul urmator rezuma tipurile de date cele mai frecvent utilizate, acceptate de MySQL si de
majoritatea bazelor de date relationale. MySQL accepta multe alte tipuri de date, dar acestea sunt
cele mai folosite.
Principalele tipuri de date din MySQL
Tip de date Descriere
BLOB - Date binare arbitrare, cu o lungime maxima de 65535 octeti
- Un sir de caractere de lungime fixa, cu un maxim de m caractere, unde
CHAR(m) m este mai mic decât 256. Pentru obtinerea lungimii dorite, se insereaza
spatii finale
DATE - O data în format an-luna-zi; de exemplu 2008-10-15
- Un numar zecimal, reprezentat sub forma de sir cu "m" cifre, din care
DECIMAL
"d" se afla la dreapta punctului zecimal. Daca "m" si "d" sunt omise, în
DECIMAL(m,d)
mod prestabilit se vor utiliza valorile 10 si 0
DOUBLE - Un numar cu virgula mobila, cu dubla precizie, având o latime de
DOUBLE (m, d) afisare egala cu "m" si un numar de "d" cifre dupa virgula.
- Un numar cu virgula mobila, cu simpla precizie, având o latime de
FLOAT(m,d)
afisare egala cu "m" si un numar de "d" cifre dupa virgula
- Un întreg pe 32 de biti. Daca se specifica atributul UNSIGNED,
INTEGER
domeniul de valori este cuprins între 0 si 4294967295; în caz contrar,
INTEGER UNSIGNED
domeniul este cuprins între valorile -2147483648 si 2147483647
NUMERIC
- Similar cu DECIMAL
NUMERIC (m, d)
REAL
- Similar cu DOUBLE
REAL(m, d)
- Un întreg pe 16 biti. Daca se specifica atributul UNSIGNED, domeniul
SMALLINT
de valori este cuprins între 0 si 65535; în caz contrar, domeniul este
SMALLINT UNSIGNED
cuprins între valorile –32768 si 32767
- Ora în format ora-minut-secunda; de exemplu, 08-20-00. O valoare de
TIME tip data si ora, în format an-luna-zi ora-minut-secunda; de exemplu,
TIMESTAMP 1976-01-05 00:00:00. Aceasta reprezentare este similara celei returnate
TIMESTAMP(m) de functiile UNIX. Pt. stocare valoarea este transformata din timpul
curent in UTC si transformata invers la solicitarea datei.
- Un sir caracter de lungime variabila, cu un maximum de "m" caractere,
unde m este mai mic decât 256 pentru versiuni MySQL anterioare 5.0.3,
VARCHAR(m)
iar pt. cele mai noi limita este 65 535 bytes. Spatiile finale au fost
eliminate
Iata cateva indicatii pentru selectarea tipurilor de date:
- Alegeti BLOB ca tip pentru datele pe care nu trebuie sa le manipulati si la care nu veti
obtine acces prin intermediul limbajului SQL.
- Alegeti un tip data sau ora adecvat pentru coloanele care contin date calendaristice sau
ore.
- Alegeti un tip numeric pentru coloanele folosite pentru numere sau în calcule.
o - Pentru cantitati foarte mari sau foarte mici, alegeti DOUBLE ca tip de date.
o - Pentru coloane care contin numere fara parte zecimala de dimensiuni medii,
alegeti SMALLINT sau INTEGER ca tip de date.
o - Pentru alte coloane care contin date numerice, alegeti DECIMAL ca tip de
date.
- Alegeti CHAR sau VARCHAR ca tip pentru celelalte coloane, chiar si pentru cele care contin
cifre, cum ar fi un cod postal.
Unde "nume_db" este numele bazei de date. Cu aceeasi comanda "USE nume_db" se schimba si
baza de date in care vrem sa lucram.
Pentru a crea un tabel într-o baza de date, emiteti comanda "CREATE TABLE", care are urmatoarea
forma:
CREATE TABLE tabel (coloana tip, coloana tip, …);
Unde "tabel" este numele tabelului, "coloana" este numele unei coloane, "tip" este tipul datelor
incluse în coloana, se poate specifica un numar nedefinit de coloane.
De exemplu, comanda urmatoare creeaza un tabel numit "carte", care contine coloanele "carteid",
"titlu" si "pret":
CREATE TABLE carte (carteid CHAR(10), titlu VARCHAR(255), pret decimal(5,2));
- În afara tipului de date, intre paranteze, puteti specifica si alte atribute optionale ale unei coloane:
NOT NULL - Fiecare rând trebuie sa contina o valoare a coloanei asociate; valorile nule nu
sunt permise.
DEFAULT valoare - Daca nu este data o valoare a coloanei asociate, se va presupune
valoarea specificata.
AUTO INCREMENT - MySQL va repartiza în mod automat un numar de serie ca valoare a
coloanei asociate.
PRIMARY KEY - Coloana asociata este cheia primara a tabelului care o contine.
Iata un exemplu ceva mai complicat de creare a unui tabel, care foloseste unele din aceste atribute
optionale:
CREATE TABLE carte (carteid CHAR(10) PRIMARY KEY,
titlu VARCHAR(255) NOT NULL,
pret DECIMAL(5,2) DEFAULT 50.00);
Unde "tabel" este numele tabelului care va fi modificat, iar "coloana" este numele coloanei care va fi
stearsa.
O alta forma a comenzii va permite sa adaugati o noua coloana în tabel:
ALTER TABLE tabel ADD coloana tip [optiuni];
Unde "tabel" este numele tabelului care va fi modificat, "coloana" este numele coloanei care va fi
adaugata, "tip" este tipul noii coloane, iar "[optiuni]" constituie toate optiunile dorite, precum
PRIMARY KEY.
De exemplu, pentru a adauga coloana "pretnou" la tabelul "carte", scrieti comanda:
ALTER TABLE carte ADD pretnou DECIMAL(5,2) DEFAULT 50.00;
Pentru a vedea toate bazele de date create in MySQL, folositi urmatoarea comanda:
SHOW DATABASES;
Pentru a vedea toate tabelele dintr-o baza de date din MySQL, folositi urmatoarea comanda:
SHOW TABLES;
Pentru a vedea toate coloanele dintr-un tabel, si atributele acestora, folositi urmatoarea comanda:
SHOW COLUMNS FROM tabel;
Unde "tabel" este numele tabelului, "utilizator" este numele contului de utilizator, iar "parola" este
parola pe care o va furniza utilizatorul pentru a-si proba identitatea.
Alternativ, administratorul de sistem poate autoriza un utilizator sa obtina acces la orice tabel dintr-o
baza de date specificata, folosind urmatoarea forma a comenzii "GRANT":
GRANT ALL ON baza_de_date.* TO utilizator IDENTIFIED BY ’parola’;
- Unde "privilegiu" este privilegiul care urmeaza a fi extins, "coloane" sunt coloanele carora li se
aplica privilegiul, iar "tabel", "baza_de_date", "utilizator" si "parola" au semnificatiile cunoscute.
Sunt permise si forme similare ale comenzii REVOKE:
REVOKE privilegiu (coloane) ON tabel FROM utilizator;
sau
REVOKE privilegiu (coloane) ON baza_de_date.* FROM utilizator;
De exemplu, pentru a permite unui utilizator sa obtina accesul la o coloana, fara a o modifica, puteti
folosi o secventa de comenzi similara cu urmatoarea:
REVOKE ALL ON carte FROM Marius;
GRANT
SELECT(carteid, titlu, pret),
INSERT(carteid, titlu, pret),
UPDATE(carteid, titlu, pret)
ON carte TO php IDENTIFIED BY 'mypassword';
REVOKE INSERT(pret) ON carte FROM Marius;
REVOKE UPDATE(pret) ON carte FROM Marius;
- Prima comanda revoca toate privilegiile de la nivelul tabelului; în caz contrar, aceste privilegii le vor
elimina pe cele situate la nivel de coloana.
Pentru a vedea privilegiile acordate unui anumit utilizator, folositi urmatoarea comanda:
SHOW GRANTS FOR nume_utilizator;
Caracteristica privilegiilor furnizata de MySQL este mai sofisticata si furnizeaza mult mai multe
optiuni. Pentru mai multe informatii, consultati manualul SQL de la adresa www.mysql.com
- Unde "tabel" este numele tabelului, iar "coloana1" si "coloana2" sunt coloanele la care se va obtine
accesul si al caror continut va fi afisat.
Puteti specifica mai multe coloane, separate prin virgula.
Daca vreti sa fie selectate numai acele rânduri care satisfac un anumit criteriu, clauza "WHERE" va
permite sa specificati o conditie; rândurile care nu satisfac conditia nu sunt raportate.
De exemplu, iata o interogare care raporteaza un singur rând:
SELECT titlu, pret FROM carte WHERE carteid=1;
Forma conditiilor folosite în sub-limbajul DML al limbajului SQL este similara cu aceea a conditiilor
PHP. Puteti folosi oricare din urmatorii operatori relationali:
= Egalitate
<> Inegalitate
!= Inegalitate, diferit de
< Mai mic decat
> Mai mare decat
<= Mai mic sau egal cu
=> Mai mare sau egal cu
Puteti compara valoarea unei coloane cu aceea a altei coloane, respectiv valoarea unei coloane cu o
valoare string. Valorile string SQL (sirurile) trebuie sa fie incluse între ghilimele simple, nu între
ghilimelele duble.
Când unei coloane nu i-a fost repartizata nici o valoare, SQL îi atribuie valoarea speciala NULL. De
asemenea, programatorii pot atribui în mod explicit valoarea NULL unei coloane.
Comparatiile obisnuite cu valori NULL, care folosesc operatorii de (in)egalitate, vor returna un rezultat
fals. Totusi, puteti folosi operatorul special "<=>". care compara valorile tinând cont de valoarea NULL.
Daca folositi acest operator pentru a compara doua valori NULL, se obtine un rezultat adevarat.
SQL include si numerosi operatori de comparatie non-algebrici:
Operator Descriere
x BETWEEN y AND z Adevarat, daca valoarea lui x este cuprinsa între valorile lui y si z
x LIKE y Adevarat daca valoarea lui x este echivalenta cu modelul y
x NOT LIKE y Adevarat daca valoarea lui x nu este echivalenta cu modelul y
Adevarat daca valoarea lui x este un membru al listei y1, y2. Lista
x IN (y1, y2)
poate contine unul, doi sau mai multi membri
Adevarat daca valoarea lui x nu este un membru al listei y1, y2.
x NOT IN (y1, y2)
Lista poate contine unul, doi sau mai multi membri
x IS NULL Adevarat daca x are valoarea NULL
x IS NOT NULL Adevarat daca x nu are valoarea NULL
Sub-limbajul folosit pentru specificarea modelelor asociate operatorului "LIKE" este diferit de cel
folosit de PHP. Meta-caracterul "%" corespunde unui numar de zero sau mai multe caractere, iar
meta-caracterul "_" corespunde unui singur caracter.
Modelele, precum sirurile, sunt incluse între ghilimele simple.
- De exemplu, modelul '%ar%' corespunde oricarui sir care contine sub-sirul 'ar', inclusiv siruri
precum 'ar', 'arc' si 'un zar'.
Pentru a plasa un caracter "%" sau "_" într-un sir test, folositi secventa "\%" sau "\_"; ca în PHP.
Ca si PHP, sub-limbajul DML din SQL va permite sa formati expresii logice care combina expresiile
relationale. Puteti folosi oricare din urmatorii operatori logici:
AND , && - SI, adevarat daca ambii operanzi sunt adevarati
OR , || - SAU, adevarat daca un operand este adevarat
NOT , ! - NU, adevarat daca operandul este fals
De exemplu, urmatoarea interogare raporteaza rândurile care au pretul de carte mai mare decât 11
sau al caror titlu include sub-sirul 'Curs':
SELECT titlu, pret FROM carte
WHERE pret>11 OR titlu LIKE ’%Curs%’;
Pentru a compara o valoare cu o expresie regulata în MySQL, folositi urmatoarea forma:
x REGEXP y, unde "x" este valoarea care va fi testata, iar "y" este o expresie regulata, delimitata prin
ghilimele simple.
Unde coloana denumita "coloana1" primeste valoarea "valoare1", iar coloana denumita "coloana2"
primeste valoarea "valoare2".
Pot fi specificate mai mult sau mai putin de doua coloane si valori. Numarul coloanelor specificate
trebuie sa fie egal cu numarul valorilor specificate.
Coloanele care nu sunt denumite în comanda "INSERT" si care nu au o valoare prestabilita (DEFAULT)
primesc valoarea NULL, cu exceptia situatiilor când valoarea respectiva nu este permisa (în acest caz,
comanda INSERT esueaza).
Daca doriti sa adaugati mai multe randuri intr-un tabel, intr-o singura inserare, puteti folosi
urmatoarea forma a comenzii INSERT:
INSERT INTO tabel (coloana1, coloana2)
VALUES (valoare1, valoare2),
(valoare3, valoare4),
(valoare5, valoare6);
Pentru a modifica valoarea unui rând sau mai multor rânduri existente într-un tabel, folositi o
comanda "UPDATE", care are urmatoarea forma:
UPDATE tabel SET coloana1=valoare1, coloana2=valoare2
WHERE conditie;
- Unde "tabel" este numele tabelului ale carui rânduri urmeaza sa fie modificate, "coloana1" este
numele primei coloane care urmeaza a fi modificata, "valoare1" este valoarea care va fi repartizata în
"coloana1", "coloana2" este numele celei de-a doua coloane care urmeaza a fi modificata, "valoare2"
este valoarea care va fi repartizata în "coloana2", iar "conditie" identifica rândul sau rândurile care
urmeaza a fi actualizate, dupa o anumita conditie.
Poate fi actualizat un numar mai mare sau mai mic de coloane. Daca se doreste ca toate randurile
coloanei sa fie actualizate, clauza "WHERE" poate fi omisa.
De exemplu, comanda urmatoare modifica din coloana "titlu" numele asociat cartii in "Curs2", in
randul unde coloana "pret" are valoarea 5.
UPDATE carte SET titlu=’Curs2’
WHERE pret=5;
Pentru a sterge un rând dintr-un tabel, folositi comanda "DELETE", care are urmatoarea forma:
DELETE FROM tabel WHERE conditie;
Daca se vrea a fi sterse toate rândurile tabelului, clauza WHERE poate fi omisa.
De exemplu, comanda urmatoare sterge rândul din tabelul "carte" asociat titlului "Curs2":
DELETE FROM carte WHERE titlu='Curs2';
4. Sortarea si gruparea
Deseori, este important ca datele sa fie raportate într-o anumita secventa. Puteti specifica
ordinea de raportare a rezultatelor interogarii folosind clauza "ORDER BY", care are urmatoarea
forma:
ORDER BY valoare
Daca se vor folosi mai multe câmpuri de sortare, acestea vor fi separate prin virgula.
Daca doriti sa indicati o sortare descendenta, în locul uneia ascendente, specificati "DESC" dupa
valoare.
De exemplu, pentru a ordona toate cartile în functie de pret, de la cel mai mare la cel mai mic,
respectiv dupa titlu pentru un pret egal, puteti folosi urmatoarea interogare:
SELECT pret, titlu FROM carte
ORDER BY pret DESC, titlu;
Pentru a include numai titlurile care au un pret mai mare de 50, adaugati o clauza WHERE la
comanda SELECT:
SELECT pret, titlu FROM carte
WHERE pret>50
ORDER BY pret DESC, titlu;
SQL include functii care va permit sa raportati valori diferite, valori utile, precum un numar al
rândurilor tabelului. Iata cele mai importante functii in acest sens:
Functie Descriere
count(*) - Numarul rândurilor din tabel
- Numarul rândurilor din tabel care contin o valoare
count(coloana)
diferita de NULL în coloana specificata
- Numarul valorilor distincte diferite de NULL care
count(distinct coloana)
apar în coloana specificata
- Valoarea mijlocie (medie) a coloanei numerice
avg(coloana)
specificate
min(coloana) - Valoarea minima din coloana specificata
max(coloana) - Valoarea maxima din coloana specificata
sum(coloana) - Suma valorilor din coloana specificata
De exemplu, interogarea urmatoare raporteaza numarul cartilor si pretul mediu al acestora:
SELECT count(*), avg(pret) FROM carte;
- Datele de iesire vor fi afisate pe o singura linie.
Clauza SQL "AS" specifica un nume nou pentru o coloana sau expresie. Numele specificat este folosit
ca titlu în rapoartele SQL. Clauza "AS" este utila în lucrul cu functiile din tabelul anterior, va ajuta sa
identificati mai usor datele de iesire.
De exemplu, interogarea precedenta poate fi rescrisa pentru a include o clauza "AS", astfel:
SELECT count(*) AS Carte_Numar,
avg(pret) AS Pret_Mediu
FROM carte;
O alta clauza utila este "GROUP BY", aceasta are urmatoarea forma:
GROUP BY coloana-sortare
- Unde "coloana-sortare" este numele sau valoarea unei coloane, specificata într-o clauza "ORDER
BY", care trebuie sa urmeze dupa clauza "GROUP BY".
De exemplu, avem un tabel "carte" cu 4 coloane (carteid, titlu, anul si pret), interogarea urmatoare
raporteaza numarul cartilor si pretul mediu pentru fiecare an (anul) în parte:
SELECT count(*), avg(pret) FROM carte
GROUP BY anul
ORDER BY anul;
Pentru a include în datele de iesire numai grupurile selectate, specificati clauza "HAVING" imediat
dupa clauza "GROUP BY". Clauza "HAVING" are urmatoarea forma:
HAVING conditie
De exemplu, pentru a include numai cartile al caror atribut "anul" are valoare mai mare decât 1980,
srieti urmatoarea interogare:
SELECT count(*), avg(pret) FROM carte
GROUP BY anul
HAVING anul>1980
ORDER BY anul;
Mai jos sunt afisati operatorii matematici folositi in SQL:
+ Adunare
- Scadere
* Inmultire
/ Impartire
| SAU, la nivel de bit
& SI la nivel de bit
>> Deplasare la dreapta
<< Deplasare la stanga
_ Complement la nivel de bit
1. Expresii si functi i
SQL va permite sa formati expresii folosind valori din coloane, valori literale si functii. Ca si în
PHP, puteti controla ordinea de evaluare a expresiilor SQL folosind paranteze pentru a delimita
sub-expresiile care trebuie evaluate mai intai.
Tabelele urmatoare rezuma functiile MySQL frecvent folosite
Functii matematice frecvent folosite în MySQL
Functie Descriere
abs(x) - Valoarea absoluta a lui x
atan(x) - Arc tangenta lui x, unde x este dat în radiani
- Arc tangenta lui y/x, unde semnele ambelor argumente sunt
atan2(y,x)
folosite pentru a determina cadranul cercului trigonometric
ceiling(x) - Cel mai mic întreg care nu este mai mic decât x
cos(x) - Cosinusul lui x, unde x este exprimat în radiani
exp(x) - Baza logaritmilor naturali (e) ridicata la puterea x
floor(x) - Cel mai mare întreg care nu este mai mare decât x
log (x) - Logaritmul natural al lui x
mod(x,y) - Restul împartirii x/y
power(x,y) - x la puterea y
- Valoare aleatoare cu virgula, mai mare sau egala cu zero si mai
rand(x)
mica decât unu
- Valoarea -1, 0 sau 1, dupa cum valoarea lui x este negativa, zero
sign(x)
sau pozitiva
sin(x) - Sinusul lui x, unde x este dat în radiani
sqrt(x) - Radacina patrata a lui x
tan(x) - Tangenta lui x, unde x este dat în radiani
2. Uniri
SQL va permite sa obtineti accesul la mai multe tabele într-o singura interogare, în
general, aceasta operatie se executa pentru ca datele dintr-un tabel sa poata fi folosite cu
date din alt tabel.
De exemplu, sa presupunem ca baza de date este asemanatoare celei prezentate mai jos,
unde avem doua tabele, primul numit "persoane" iar cel de-al oilea numit "meserii", si o
relatie cheie externa - cheie primara (persoanaid) asociaza cele doua tabelele.
persoanaid nume AnNastere meserie persoanaid
001 George Washington 1732 Arhitect 003
002 John Adams 1735 General 001
003 Thomas Jefferson 1743 Filozof 002
Sa examinam urmatoarea interogare:
SELECT nume, meserie FROM persoane, meserii
WHERE persoane.persoanaid=meserii.persoanaid;
- Constructiile "persoane.persoanaid" si "meserii.persoanaid" se numesc "nume definite", prima se
refera la coloana "persoanaid" din tabelul "persoane", iar a doua se refera la coloana "persoanaid" a
tabelului "meserii".
- Clauza WHERE asigura o echivalenta între valoarea cheii externe din tabelul "meserii" cu aceea a
cheii primare din tabelul "persoane", (în absenta clauzei WHERE, se va stabili o corespondenta între
fiecare rând din tabelul cu meserii si fiecare rând din tabelul cu persoane; un asemenea rezultat,
numit "produs cartezian", contine în general multe rânduri - majoritatea nedorite - si ca atare trebuie
evitat).
- Rezultatul interogarii de mai sus este un raport care indica numele si meseria asociata fiecarui
angajat prezentat în tabelul "meserii".
O interogare ca aceasta, care combina date din mai multe tabele, se numeste "unire". Sunt posibile si
uniri mai complexe, care implica trei sau mai multe tabele.
Daca un rând dat din tabelul principal (aici "persoane") nu are nici un rând asociat în tabelul cu detalii
(aici "meserii"), rândul respectiv din tabelul principal nu va aparea în datele de iesire ale unei uniri. In
cazul acesta, pentru a determina aparitia acestei înregistrari din tabelul principal, se poate folosi o
categorie speciala de unire, cunoscuta sub numele de "unire la stânga" sau "unire exterioara la
stânga". Iata un exemplu:
SELECT nume, meserie FROM persoane
LEFT JOIN meserii
ON persoane.persoanaid=meserii.persoanaid;
Aceasta interogare va afisa toate persoanele, indiferent daca acestea au sau nu asociata o meserie.
Persoanele fara o meserie au specificatia NULL în coloana corespunzatoare meseriei.
3. Executarea instructi unilor dintr-un fi sier extern
Comenzile MySQL pot fi scrise si intr-un fisier extern (editat de exemplu, in Windows, cu
Notepad), acest fisier se numeste "script de shell".
Scriptul din fisierul extern poate fi executat din fereastra de comanda MySQL (MySQL Command
Line Client), utilizand comanda:
SOURCE nume_fisier
Unde "nume_fisier" este calea si numele fisierului in care se afla scriptul de shell.
De exemplu, scriem urmatoarele comenzi intr-un fisier numit "lucru.txt" pe care-l salvam in
directorul "C:/teste".
CREATE DATABASE lucrudb;
USE lucrudb;
GRANT ALL ON lucrudb.* TO php IDENTIFIED BY 'mypass';
Faptul ca limbajul PHP a devenit atat de popular se datoreaza in mare masura faptului ca acesta
contine suport de functii pentru lucrul cu bazele de date.
mysql_close();
?>
mysql_select_db("lucrudb");
if (mysql_error()) {
echo "<br />". mysql_errno(). " : ". mysql_error();
}
?>
Daca se reuseste conexiunea la serverul MySQL si baza de date cu numele "lucrudb" este inexistenta,
rezultatul afisat de exemplul de mai sus va fi urmatorul:
Connected to MySQL
1049 : Unknown database 'lucrudb'
Pentru a crea o noua baza de date folosim comanda SQL "CREATE DATABASE numeBazaDeDate;",
pe care o putem lansa de la o consola MySQL, sau o putem apela de la un script PHP prin
intermediul functiei mysql_query(). Iata un exemplu prin care creem baza de date "lucrudb":
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$createdb = mysql_query("CREATE DATABASE lucrudb");
if ($createdb)
echo "Baza de date lucrudb a fost creata <br />";
else
echo "<br />". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
- Dupa executarea acestui script, daca totul este corect, va fi creata baza de date "lucrudb" si va fi
afisat mesajul "Baza de date lucrudb a fost creata".
Dupa ce programul a obtinut o conexiune cu serverul MySQL, inainte de a lucra cu tabelele dintr-o
baza de date MySQL, programul trebuie sa selecteze baza de date respectiva. Pentru aceasta, folositi
functia mysql_select_db(), care are urmatoarea forma:
mysql_select_db(baza_de_date)
Unde "baza_de_date" este numele bazei de date la care urmeaza a se obtine acces.
Functia returneaza TRUE daca poate obtine accesul la baza de date, respectiv FALSE în caz contrar.
Iata un exemplu de selectare a bazei de date "lucrudb":
<?php
$conn = mysql_connect( "localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if ($selectdb)
echo "Baza de date lucrudb a fost selectata <br />";
else
echo "<br />". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
5. Crearea tabelelor
Dupa conectare si selectarea bazei de date putem crea tabele in cadrul bazei de date selectate.
Pentru aceasta folosim limbajul SQL CREATE TABLE numeTabel (coloana1, coloana2, ...); impreuna
cu functia mysql_query().
In exemplul urmator cream tabelul cu numele "carti" care contine urmatoarele campuri:
Nume camp Tip
id Identificator unic, Not Null, cheie primara
nume Char(30)
autor Char(25)
gen Char(10)
data_intrare Date
pret Decimal(12,2)
In stanga, la "Nume Camp", sunt trecute coloanele tabelului, iar in dreapta tipul acestora, coloana cu
nume "id" fiind cheia primara.
De asemenea, folosim indicatorul "AUTO_INCREMENT" pentru a preciza faptul ca MySQL va repartiza
o valoare secventiala unica în coloana care serveste drept cheie primara a tabelului.
Iata si scriptul PHP pentru creacrea tabelului:
<?php
$conn = mysql_connect("localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if (!$selectdb)
echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ". mysql_error();
$sql = "CREATE TABLE `carti` (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, nume varchar(30) NOT
NULL, autor varchar(25) , gen varchar(10) NOT NULL, data_intrare date, pret decimal(12,2))";
if (mysql_query($sql, $conn))
echo "Tabelul carti a fost creat <br />";
else
echo "Tabelul carti nu a putut fi creat deoarece : ". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
In exemplul de mai sus, variabila "$sql" contine comanda SQL pentru crearea acestui tabel.
Instructiunea mysql_query($sql, $conn), executa aceasta comanda si in cazul in care rezultatul este
TRUE se trimite la iesire sirul: "Tabelul carti a fost creat". In cazul in care instructiunea SQL nu a putut
fi executata, functiamysql_query($sql) intoarce valoarea FALSE, afisand eroarea din cauza careia
tabelul nu a putut fi creat.
$sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUES ('Glossa', 'Mihai Eminescu',
'poezie', '19-05-2009', '8')";
if (mysql_query($sql, $conn))
echo 'Datele au fost adaugate';
else
echo "Datele nu au fost adaugate deoarece : ". mysql_errno(). " : ". mysql_error();
mysql_close();
?>
- In acest exemplu, datele "'Glossa', 'Mihai Eminescu', 'poezie', '19-05-2009', '8'" vor fi adaugate in
coloanele "nume, autor, gen, data_intrare, pret" in aceeasi ordine in care sunt scrise si datele si
coloanele.
- Daca au fost adaugate cu succes, apare mesajul "Datele au fost adaugate", in caz contrar apare
mesajul de eroare.
Daca doriti sa adaugati mai multe linii in tabel, printr-o singura interogare, puteti folosi urmatorul
model
<?php
// Aici adaugati comenzile pt. conectare si selectarea bazei de date
Observati sintaxa de scriere corecta a interogarilor MySQL in PHP, numele tabelului se scrie intre
caracterele ( ` ` ) si valorile intre ghilimele simple ( ' ' )
Pentru a verifica daca o interogare UPDATE, INSERT sau DELETE a avut efectul dorit, puteti folosi
functiamysql_affected_rows(), care returneaza numarul rândurilor afectate de interogarea cea mai
recenta.
O alta functie utila este mysql_insert_id().
Cand introduceti un rand intr-un tabel a carui cheie primara este de tipul AUTO_INCREMENT,
functia mysql_insert_id()determina valoarea cheii primare atribuite de MySQL. Functia returneaza
valoarea zero daca interogarea precedenta nu a generat o valoare AUTO_INCREMENT. Ca atare,
functia trebuie apelata la putin timp dupa interogarea care a inserat rândul in tabel, astfel încât o
alta interogare ulterioara sa nu modifice rezultatul.
Iata un exemplu de utilizare a functiilor mysql_affected_rows() si mysql_insert_id() impreuna cu
iterogarea INSERT (care adauga randuri in tabel). Folosim baza de date "lucrudb" si tabelul "carti",
create in Lectia 25
<?php
$conn = mysql_connect("localhost", "Marius", "mypass")
or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if (!$selectdb)
echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ". mysql_error();
$sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUE ('Carte2', 'Autor2', 'Educativ',
'2008-9-16', 11.00)";
if (mysql_query($sql))
echo "Datele au fost adaugate in tabelul carti <br />";
else
echo "Datele nu au fost adaugate in tabelul carti deoarece : ". mysql_errno(). " : ". mysql_error();
$nranduri = mysql_affected_rows();
$id = mysql_insert_id();
if ($nranduri == -1) {
echo "INSERT nu a putut sa adauge datele";
}
else
echo "Au fost adaugate $nranduri randuri, cheia primara = $id" ;
mysql_close();
?>
Dupa ce s-a facut conectarea la serverul MySQL si s-a reusit selectarea bazei de date, variabila "$sql"
contine comanda SQL pentru introducerea unui nou rand in tabelul "carti", prin intermediul
functiei mysql_query($sql) se introduce datele in baza de date, variabila "$nranduri" preia de la
functia mysql_affected_rows() numarul de randuri afectate (aici introduse) iar variabila "$id" va avea
(prin "mysql_insert_id()") valoarea cheii primare atribuite de MySQL.
Daca nu apare nici o eroare, rezultatul afisat de acest script este urmatorul:
Datele au fost adaugate in tabelul carti
Au fost adaugate 1 randuri, chea primara = 2
- Aceste functii returneaza FALSE daca nu mai exista rânduri în setul de rezultate
Ca sa intelegeti mai bine, voi arata cate un exemplu cu fiecare in parte (voi folosi acelasi tabel,
"carti"). Studiati-le cu atentie si exersati-le singuri.
Nu s-au mai introdus in aceste exemple instructiunile pentru conectarea la serverul MySQL si pentru
selectarea bazei de date, le adaugati dumneavoastra.
De exemplu, daca doriti sa aflati toate datele din anumite coloane puteti folosi
functia mysql_fetch_assoc() astfel:
<?php
$interogare = "SELECT `nume`, `autor` FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
echo '0 rezultate';
}
else {
while ($rand = mysql_fetch_assoc($rezultat)) {
echo '<br />'. $rand['nume']. ' - '. $rand['autor'];
}
}
?>
- Variabila "$rand" devine o matrice ale carei chei sunt numele coloanelor iar valorile lor sunt datele
coloanelor respective din randul curent; instructiunea WHILE parcurge fiecare rand.
Iata acest exemplu, dar cu functia mysql_fetch_array(). In plus, in interogare SQL voi adauga numele
coloanelor prin variabile, ca sa vedeti cum se lucreaza si cu variabile.
<?php
// Variabilele cu numele coloanelor
$col1 = 'nume';
$col2 = 'autor';
Daca doriti sa afisati toate datele din fiecare coloana de pe fiecare rand al tabelului, puteti folosi
functiamysql_fetch_row() astfel:
<?php
$interogare = "SELECT * FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
echo '0 rezultate';
}
else {
while ($rand = mysql_fetch_row($rezultat)) {
foreach ($rand as $coloana) {
echo "| $coloana |";
}
echo "<br />";
}
}
?>
- Exemplul de mai sus v-a afisa urmatorul rezultat, in functie de datele din tabel:
| 1 || Glossa || Mihai Eminescu || poezie || 0000-00-00 || 8.00 |
| 2 || Carte2 || Autor2 || Educativ || 2008-09-16 || 11.00 |
| 3 || Carte3 || Autor3 || Gen3 || 2008-09-16 || 8.30 |
Daca doriti sa obtineti acces la valoarea unei anumite coloane, puteti face referire la elementul din
tablou folosind o cheie a tabloului.
De exemplu, daca rezultatul functiei mysql_fetch_row() este stocat în variabila "$rand", puteti
obtine acces la prima coloana folosind sintaxa "$rand[0]", la a doua coloana folosind sintaxa
"$rand[1]" etc.
Iata un exemplu in care este utilizata functia mysql_fetch_object(), iar in interogarea SQL este
adaugata si o conditie WHERE si o variabila "$nr".
<?php
$nr = 3;
$interogare = "SELECT `nume`, `autor` FROM `carti` WHERE `id`<'$nr'";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
echo '0 rezultate';
}
else {
while ($rand = mysql_fetch_object($rezultat)) {
echo '<br />'. $rand->nume. ' - '. $rand->autor;
}
}
?>
- Testati singuri pentru a vedea rezultatul.
Precizare: - Comform sintaxei MySQL cu PHP, numele tabelelor si coloanelor se scriu intre
caracterele ` ` (semnul din stanga tastei 1), desi functioneaza si fara, asa e corect, comform
standardului, si e necesar in cazul numelor de tabele /coloane formate din mai multe cuvinte.
- Variabilele, cum e aici $nr se scriu intre ghilimele simple ' '
Invatati sa obtineti date privind: numarul coloanelor, numele si lungimea coloanelor dintr-un
tabel MySQL
Invatati sa obtineti informatii privind indicatorii MySQL asociati coloanelor si tipul fiecarei
coloane
Invatati sa aflati numele tabelului care contine o anumita coloana si sa parcurgeti non-
secvential randurile unui tabel MySQL
Biblioteca de functii MySQL a limbajului PHP include functii care va permit sa obtineti informatii
despre un set de rezultate, inclusiv:
Numarul coloanelor din setul de rezultate
Numele fiecarei coloane
Lungimea fiecarei coloane
Indicatorii MySQL asociati coloanei
Tipul MySQL al fiecarei coloane
Numele tabelului MySQL care contine coloana
Aceasta returneaza numele coloanei din setul de rezultate. Functia preia doua argumente: valoarea
returnata de functiamysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima
coloana este 0, indexul asociat celei de-a doua coloane este l etc.
Iata un exemplu care determina numele primei coloane dintr-un tabel MySQL:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$nume = mysql_field_name($rezultat, 0);
echo "<br /> Coloana 1 : $nume";
mysql_close();
?>
Aceasta preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care
va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l
etc.
Functia mysql_field_flags() raporteaza urmatorii indicatori:
AUTO_INCREMENT
BINARY
BLOB
ENUM
MULTIPLE_KEY
NOT_NULL
PRIMARY_KEY
TIMESTAMP
UNIQUE_KEY
UNSIGNED
ZEROFILL
- Daca la o coloana sunt asociati mai multi indicatori, fiecare indicator este separat de vecinii sai prin
intermediul unui singur spatiu.
Iata un exemplu care determina indicatorii asociati primei coloane dintr-un tabel MySQL:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$indicatori = mysql_field_flags($rezultat, 0);
echo "<br /> Indicatorii Coloanei 1 : $indicatori";
mysql_close();
?>
5. Obti nerea ti pului MySQL al unei coloane
Pentru a obtine tipul MySQL al unei coloane dintr-un tabel MySQL, folositi functia
mysql_field_type()
Aceasta preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care
va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l
etc.
Principalele tipuri MySQL returnate de functia mysql_field_type() sunt prezentate in Lectia 22 , in
tabelul "Principalele tipuri de date din MySQL".
Iata un exemplu care determina tipul primei coloane dintr-un tabel MySQL:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$tip = mysql_field_type($rezultat, 0);
echo "<br /> Tip Coloana 1 : $tip";
mysql_close();
?>
Aceasta preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care
va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l
etc.
În cazul în care coloana contine o valoare calculata sau daca respectiva coloana nu este asociata în
alt mod cu un tabel MySQL, functia returneaza un sir vid.
Iata un exemplu care determina tabelul asociat primei coloane din setul de rezutate:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$tabel = mysql_field_table($rezultat, 0);
echo "<br /> Nume tabel : $tabel";
mysql_close();
?>
Aceasta functie returneaza un obiect ale carui proprietati contin o varietate de informatii cu privire la
coloana unui tabel MySQL. Proprietatile sunt urmatoarele:
blob - are valoarea 1 în cazul în care coloana este de tip BLOB
max_length - lungimea maxima a coloanei;
multiple_key - are valoarea 1 în cazul în care coloana este o cheie non-unica
name - numele coloanei
not_null - are valoarea 1 în cazul în care coloana nu poate contine valoarea NULL
numeric - are valoarea 1 în cazul în care coloana este numerica
primary_key - are valoarea 1 în cazul în care coloana este o cheie primara
table - numele tabelului MySQL caruia îi apartine coloana
type - tipul MySQL al coloanei
unique_key - are valoarea 1 în cazul în care coloana este o cheie unica
unsigned - are valoarea 1 în cazul în care coloana este de tip UNSIGNED
zerofill - are valoarea 1 în cazul în care coloana este completata cu zerouri
Unde "rezultat" este valoarea returnata de functia mysql_query(), iar "numar_rand" este indexul
rândului la care doriti sa obtineti accesul. Primul rând al tabelului este numerotat cu 0, al doilea cu 1
etc.
Functia returneaza TRUE daca executia reuseste, respectiv FALSE în caz contrar.
Apoi, o invocare ulterioara a functiei mysql_fetch_row() sau a functiei mysql_fetch_array() va
returna rândul din pozitia specificata in functia mysql_data_seek().
Studiati urmatorul exemplu, care obtine accesul la al treilea rând al setului de rezultate returnat de o
interogare anterioara:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (!mysql_data_seek($rezultat, 2)) {
echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
else {
$rand = mysql_fetch_array($rezultat, MYSQL_ASSOC);
foreach ($rand as $coloana) {
echo "| $coloana |";
}
}
mysql_close();
?>
- Acest exemplu afiseaza datele din randul trei pentru fiecare coloana a tabelului MySQL.
1. Ghilimelele magice
Apar situatii cand dorim sa introducem ghilimele in interiorul unui textintr-o baza de date, dar
SQL nu permite înglobarea unor ghilimele simple în interiorul valorii unui sir. Probleme similare pot
aparea la introducerea unui text ce contine caractere speciale precum: \ + * ? ^ ( $ ), si care sunt
trimise la un script PHP.
PHP include functii si facilitati pentru rezolvarea acestor situatii.
Fisierul de initializare PHP ("php.ini") contine optiuni de configurare care determina modul în care
PHP controleaza datele provenite de la o sursa externa, cum sunt un formular HTML, un fisier text
sau o baza de date.
Optiunea magic_quotes_gpc specifica modul în care PHP manipuleaza operatiile HTTP: GET si
POST, precum si operatiile dintre PHP si MySQL sau cele cu variabile cookie. Daca optiunea este
activata (ON), PHP prefixeaza automat ghilimelele simple, ghilimelele duble, caracterele backslash
si caracterele nule (caracterele a caror valoare ASCII este 0) care apar într-o variabila HTTP, cu un
caracter backslash (\).
Optiunea magic_quotes_runtime specifica modul în care PHP manipuleaza datele de origine
externa. Daca aceasta optiune este activata, PHP ignora automat ghilimelele simple si duble care
apar în datele externe, inclusiv datele din formularele HTML, din fisiere si baze de date.
Daca este activata optiunea magic_quotes_sybase, aceasta modifica efectul
optiunilor magic_quotes_gpc simagic_quotes_runtime, astfel încât un caracter de tip ghilimele
simple sa fie prefixat cu un alt caracter de tip ghilimele simple, nu cu un backslas.
Dar, în general, accesul la aceste comenzi din fisierul "php.ini" il are administratorul de sistem iar
utilizatorii obisnuiti nu trebuie sa aiba posibilitatea de a aduce modificari în fisier. Astfel, pot fi
folosite functii PHP care sa seteze aceste optiuni pe durata scriptului respectiv.
Functiile get_magic_quotes_gpc() si get_magic_quotes_runtime() returneaza fiecare valoarea
optiunii PHP corespunzatoare setate in fisierul "php.ini". Mai mult, puteti folosi
functia set_magic_quotes_runtime() pentru a specifica valoarea
optiunii magic_quotes_runtime pentru restul duratei scriptului PHP curent.
De exemplu, pentru a dezactiva optiunea magic_quotes_runtime, invocati functia
set_magic_quotes_runtime(0);
O alta functi utila pentru conversia caracterelor speciale este quotemeta(), aceasta va insera un
backslash înainte de fiecare aparitie a urmatoarelor caractere: . \ + * ? [ ^ ] ( $ ). Ca si addslashes(),
functia quotemeta() se foloseste in mod similar, prelund ca argument sirul text.
Unde "text" specifica sirul care contine textul ce urmeaza a fi convertit, iar argumentul optional
"stil_ghilimele" specifica modul de conversie a ghilimelelor simple, respectiv duble. Valorile permise
ale optiunii "stil_ghilimele" sunt:
ENT_COMPAT - precizeaza ca trebuie convertite numai ghilimelele duble
ENT_QUOTES - precizeaza ca trebuie convertite ambele tipuri de ghilimele
ENT_NOQUOTES - precizeaza ca nu trebuie convertit nici un tip de ghilimele
De exemplu, pentru a converti toate caracterele HTML speciale, inclusiv ambele tipuri de ghilimele,
din sirul "$texthtml", utilizati functia dupa cum urmeaza:
$conversie = htmlspecialchars($texthtml);
Functia htmlspecialchars() executa urmatoarele conversii:
Caracter Rezultatul conversiei
& (ampersand) &
" (numait când este specificată opţiunea ENT_COMPAT sau
"(ghilimele duble)
ENT_QUOTES)
'(ghilimele simple) ' (numai când este specificată opţiunea ENT_QUOTES)
< (mai mic decât) <
> (mai mare decât) >
O functie PHP conexa, htmlentities(), converteste toate caracterele cu echivalente în entitati HTML.
Este acceptat setul de caractere ISO-8859-1
Si o alta functie utila pentru conversia textelor HTML este functia n12br(). Aceasta insereaza tag-ul
<br /> anterior fiecarui caracter de tip linie noua care se gaseste in argumentul sau.
Ca sa intelegeti mai bine aceste moduri de conversie, puteti studia amanuntit exemplul urmator:
<?php
$b = addslashes($a);
$c = stripslashes($b);
$d = quotemeta($a);
$e = htmlentities($a);
$f = urlencode($a);
O abordare importanta a activitatii de programare, care a devenit populara în anii '90, este
orientarea spre obiecte.
Orientarea spre obiecte a fost creata ca o modalitate de organizare a unor programe de simulare
complexe. Cu toate acestea, progresul interfetelor grafice cu utilizatorul din perioada anilor '90 a
dus la descoperirea ca metodele orientate spre obiecte faciliteaza scrierea programelor interactive.
Principiul de baza al programarii orientate spre obiecte (POD) îl reprezinta incapsularea datelor.
Un program care nu este orientat spre obiecte este organizat ca un set de functii si un set de
variabile globale utilizate de acele functii. Orice functie poate opera folosind orice variabila
globala,. Un program orientat spre obiecte combina functii si variabile într-o unitate, cunoscuta sub
numele de "clasa". Un program orientat spre obiecte caracteristic este alcatuit din mai multe clase.
Programele orientate spre obiecte pot fi mai usor de înteles decât programele care nu sunt
orientate spre obiecte, deoarece interactiunile între clasele unui program orientat spre obiecte
sunt relativ reduse ca numar. Astfel, un programator poate studia si întelege un program orientat
spre obiecte abordând fiecare clasa în parte, nu toate clasele deodata.
Pe langa modatitatea de programare structurata, invatata pana acum, PHP va permite sa creati si
sa folositi clasele, obiectele, respectiv proprietatile si metodele asociate acestora.
Aceasta lectie prezinta conceptele orientarii spre obiecte într-un mod general si va invata sa folositi
caracteristicile orientate spre obiecte ale limbajului PHP.
1. Clasele
O clasa este de fapt o structura care contine variabile (membrii) si functii (metode), Metodele
sunt operatiile pe care membrii clasei le pot efectua.
Membrii si metodele declarate intr-o clasa apartin clasei respective si se acceseaza specificand
numele clasei.
O clasa poate include o metoda speciala, numita "metoda constructor" sau "constructor". Aceasta
este o functiei din clasa care are acelasi nume cu denumirea clasei.
Diferenta între clasa si obiect este importanta. Daca o clasa poate fi asimilata unui tip de date, un
obiect poate fi echivalat cu o variabila sau cu o valoare avand un anumit tip de date. Practic, o clasa
este o "fabrica" de obiecte, care produce obiecte cu aceeasi structura, avand proprietati si metode
identice.
- Pe langa incapsularea datelor, o alta caracteristica importanta al POD este mostenirea
Mostenirea consta in aceea ca putem declara anumite clase ca fiind derivate din alte clase de baza.
In cele mai multe situatii clasa derivata (numita si clasa copil) extinde, primeste functionalitatile
clasei de baza (numita si clasa parinte). In acest fel se reduce foarte mult cantitatea de cod
necesara.
Pentru a intelege mai bine modalitatea de definire a unei clase în PHP, consideram urmatorul
exemplu in care alcatuim o clasa simpla denumita "ContBanca":
<?php
// Definirea clasei
class ContBanca {
var $sold = 0; // Membru clasei
Instantierea unei clase se face prin operatorul "new", avand urmatoarea forma generala:
$nume_variabila = new nume_clasa();
class ContBanca {
var $sold = 0; // Membru clasei
class ContBanca {
// Membri clasei
var $cont_id;
var $nume_posesor;
var $sold = 0;
function inchide_cont() {
$suma = $this->sold;
$this->sold = 1;
return $this->sold;
}
}
?>
Sa presupunem ca dorim sa derivam din aceasta o clasa copil care reprezinta un nou tip de cont
bancar, cu dobânda. La închiderea contului, programul trebuie sa calculeze dobânda pe care sa o
adauge la soldul curent si sa returneze suma acumulata.
Iata cum putem proceda, definim clasa derivata astfe:
<?php
class ContEco extends ContBanca2 {
function inchide_cont($zile, $rata) {
$suma = $this->sold * $rata * ($zile / 365);
$suma = $suma + $this->sold;
$this->sold = 1;
return $suma;
}
}
?>
- In cadrul clasei derivate (copil) este definita o metoda numita "inchide_cont()". O metoda cu acelasi
nume exista si în clasa de baza (clasa parinte), dar are o alta definitie. Astfel, in clasa copil nu va mai
fi mostenita metoda cu acelasi nume, ci o va folosi pe cea proprie.
In continuare creem un obiect "ContEco" si apelam metoda "inchide_cont()" astfel:
<?php
// Aici sunt adaugate datele pentru definirea clasei de baza, ContBanca2
// Aici sunt adaugate datele pentru definirea clasei derivate, ContEco
Cu toate acestea, este posibila invocarea metodei redefinite. Prin specificarea in clasa copil a
numelui clasei parinte, urmat de o pereche de caractere doua puncte (::) si metoda redefinita. Astfel
se poate indica programului PHP sa foloseasca metoda, cu acelasi nume, definita în clasa parinte, nu
metoda definita în clasa copil.
Invocarea unei metode redefinite este un procedeu mai complicat, pentru incepatori este mai bine a
fi evitat deoarece poate complica intelegerea scriptului.
3. Tablouri cu obiecte
Tablourile (numite si matrice) reprezinta o modalitate convenabila pentru lucrul cu mai multe
valori. Valorile stocate în tablouri pot face referire la obiecte exact asa cum procedeaza în cazul
numerelor sau al sirurilor.
Un tablou care face referire la obiecte se numeste "tablou cu obiecte".
Pentru a intelege modul de utilizare a unui tablou cu obiecte, sa examinam urmatoarea clasa
"ContBanca" si doua clase copil ale acesteia:
<?php
// Clasa parinte
class ContBanca {
var $cont_id;
var $nume_posesor;
var $sold;
var $tip_cont;
function dump() {
return "Cont = ". $this->cont_id.
" posesor = ". $this->nume_posesor.
" sold = ". $this->sold.
" tip = ". $this->tip_cont;
}
}
Studiati cu atentie aceste exemple si exersatile (adaugand si alte valori) pana le intelegeti.
Este util sa avem pe o pagina din site un formular prin care vizitatorii sa poata trimite mesaje la
o adresa de e-mail.
Am putea lasa pe pagina doar adresa de e-mail la care vizitatorii sa ne poata contacta, dar aceasta
metoda (comoda pt. webmaster) nu este indicata. In primul rand din cauza programelor bot care
circula pe net si colecteaza adresele de e-mail de pe site-uri pentru ca mai tarziu sa transmita mail-
uri spam. In al doilea rand este mai simplu si mai rapid pentru vizitator sa trimita mesajul direct de
pe site.
In cadrul acestei lectii este explicat un mod simplu de utilizare a limbajului PHP pentru a expedia la
o adresa de e-mail date sub forma de text, preluate de la un formular HTML.
Pentru a putea expedia datele la adresa de mail, scripturile PHP trebuie sa fie capabile de a obtine
accesul la serviciile SMTP (Simple Mail Transfer Protocol).
Daca folositi serviciile oferite de un "web hosting", majoritatea au implementate aceste functii.
Daca folositi propriul sistem pentru gazduirea site-ului, sau pentru teste, este nevoie sa aveti
instalat si un server SMTP, acesta preia datele prelucrate de modulul PHP si le trimite la adresa de
e-mail.
Pentru a trimite datele la o adresa de e-mail, se foloseste functia mail(), care preia 3 argumente
principale, avand urmatoarea forma:
mail($to, $subject, $message)
Functia "mail()" poate contine si alte adrese de e-mail optionale, astfel un al patrulea argument
poate fi "From", care indica adresa de e-mail a expeditorului (cel care trimite mesajul).
Functia ar avea astfel urmatoarea forma:
mail($to, $subject, $message, $from )
- Variabila "$from" trebuie sa contina in sir cuvantul "From: " inaintea adresei de e-mail, adica asa:
$from="From: adresa@de.mail";
- Daca argumentul "$from" nu este specificat, serverul va transmite automat aceasta adresa (in
functie de cum este configurat). Astfel, cand primim mail-ul, pe langa subiect vom avea adresa
expeditorului, si daca nu este specificata, putem vedea ceva de genul "nobody@localhost.ro"
Datele pentru aceste argumente, in special al treilea (aici "$message"), pot fi preluate dintr-un
formular HTML, folosind functia "$_POST".
Functia "mail()" returneaza TRUE daca mail-ul a fost acceptat pentru expediere, in caz contrar
returneaza FALSE.
Trimiteti mesaj
E-mail :
Scrie mesajul :
Trimite
- In Partea 2 invatati cum sa trimiteti mail-uri cu PHP care pot cotine tag-uri HTML si cod CSS.
Part. 2
Pe langa crearea de cod de tip text (HTML, XML, ...), PHP poate fi folosit si pentru crearea si
manipularea de imagini cu diferite formate (GIF, PNG, JPEG, WBMP si XPM).
PHP are implemetat cateva functii pentru lucru cu informatii legate de imagini, cum ar fi lungimea,
latimea sau extensia imaginii. Pentru crearea de noi imagini sau manipularea celor existente este
necesar sa aveti instalat in PHP o librarii GD cu functii pentru imagini. Pentru mai multe informatii
despre cerinte si instalare librarie GD, vizitati GD library.
- Daca folositi WampServer sau Xampp, acestea au deja incluse librarii GD.
Puteti afla informatii despre libraria GD instalata folosind functia gd_info(), aceasta returneaza o
matrice cu informatii despre libraria GD inclusa.
Exemplu:
<?php
var_dump(gd_info());
?>
1. Crearea imaginilor
Pentru crearea unei imagini cu PHP sunt esentiali urmatorii pasi:
- Definirea identificatorului de imagine si suprafata de baza a imaginii.
- Stabilirea culorilor fundalului, formei sau a textului din imagine.
- Trimiterea datelor de iesire cu imaginea creata.
- Eliberarea memoriei asociata creeri imaginii.
Cam asta e, pe scurt, partea teoretica, acum sa trecem la practica, voi prezenta pas cu pas un script
PHP simplu care va afisa in browser o imagine PNG formata dintr-un dreptunghi cu fundal albastru si
in interior un text.
Scriptul este urmatorul:
<?php
$text = 'Textul din imagine';
// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$text_color = imagecolorallocate($im, 255, 255, 255);
// finalizarea imaginii
imagefill($im, 0, 0, $fundal);
imagestring($im, 4, 10, 15, $text, $text_color);
// curatarea memoriei
imagedestroy($im);
?>
- Acest script va afisa urmatorul rezultat
- Urmatorul pas este definirea culorii pentru fundal si pentru text, pentru aceasta se foloseste
functiaimagecolorallocate(), aceasta returneaza un identificator de culoare care va fi folosit pentru
accesarea culorii si preia 4 argumente: primul argument este identificatorul de imagine creat cu
"imagecreate()" (in script este in variabila "$im"), urmatoarele trei argumente reprezinta valorile RGB
(Red, Green, Blue) pentru stabilirea culorii.
- Pentru adaugarea culorii de fundal se foloseste functia imagefill(), care preia 4 argumente (in
script avem "imagefill($im, 0, 0, $fundal);"), argumentele sunt:
- identificatorul de imagine
- urmatoarele doua argumente definesc coordonatele X si Y de start pentru umplerea culorii
(0, 0)
- ultimul argument reprezinta identificatorul de culoare folosit (aici cel din variabila $fundal)
a) Puteti folosi scriptul pentru a salva imaginea pe server (dupa cum a fost explicat mai sus) si apoi
folositi etichete <img> pentru afisarea imaginii
- Exemplu:
<?php
$text = 'Textul din imagine';
// setare dimensiuni
$height = 50;
$width = 170;
$im = imagecreate($width, $height);
// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$text_color = imagecolorallocate($im, 255, 255, 255);
// finalizarea imaginii
imagestring($im, 4, 10, 15, $text, $text_color);
// curatarea memoriei
imagedestroy($im);
?>
---
b) O alta metoda este scrierea intr-un fisier php extern a scriptului care genereaza si afiseaza
imaginea, apoi apelati scriptul PHP in atributul src, ca in exemplul urmator:
<img src="script_img.php" alt="Afisare 1" />
--- <img src="script_img.php" alt="Afisare 2" />
- Unde "script_img.php" este fisierul PHP care genereaza si afiseaza imaginea
- In urmatoarea lectie, Lectia 33, sunt prezentate mai multe functii utile in lucrul cu imagini
generate de PHP.
In aceasta lectie sunt prezentate, cu exemple, cateva functii utile pentru lucrul cu imagini
generate de PHP.
1. Functi a imageline()
- Aceasta functie deseneaza o linie in cadrul imaginii, sintaxa generala este urmatoarea:
imageline("identificator_im", "x1", "y1", "x2", "y2", "id_culoare")
Unde
- "identificator_im" reprezinta identificatorul de imagine returnat de o functie pentru
crearea imaginii, cum e "imagecreate", "imagecreatetruecolor" sau
"imagecreatefrompng" (pt. imagine PNG)
- "x1" si "y1" reprezinta coordonatele de start (x, y) pentru punctul de incepere a liniei (in
pixeli, in raport cu marginea din stanga si de sus)
- "x2" si "y2" reprezinta coordonatele de final (x, y) pentru punctul de terminare a liniei (in
pixeli, in raport cu marginea din stanga si de sus)
- "id_culoare" reprezinta identificatorul de culoare folosit pentru culoarea liniei (returnat de
functia "imagecolorallocate")
Iata un exemplu:
<?php
// setare dimensiuni
$height = 40;
$width = 170;
// definirea cadrului de baza a imaginii
$im = imagecreate($width, $height);
// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$line_color = imagecolorallocate($im, 200, 220, 8);
// crearea imaginii
imagefill($im, 0, 0, $fundal);
imageline($im, 50, 10, 120, 10, $line_color); // prima linie
imageline($im, 40, 20, 130, 20, $line_color); // a doua linie
// curatarea memoriei
imagedestroy($im);
?>
- Comentariile necesare sunt deja in codul scriptului.
- Functia "imageline()", folosita de 2 ori, va crea doua linii dupa coordonatele dintre paranteze.
- Rezultatul accestui script este imaginea de mai jos
2. Functi a imagearc()
- Aceasta functie deseneaza un arc de cerc centrat pe anumite coordonate date. Sintaxa
generala este urmatoarea:
imagearc("identificator_im", "x1", "y1", "width", "height", "start", "end", "id_culoare")
Unde
- "identificator_im" reprezinta identificatorul de imagine returnat de o functie pentru
crearea imaginii, cum e "imagecreate", "imagecreatetruecolor" sau
"imagecreatefrompng" (pt. imagine PNG)
- "x1" si "y1" reprezinta coordonatele de start (x, y) pentru centrul arcului de cerc (in pixeli,
in raport cu marginea din stanga si de sus)
- "width" si "height" reprezinta lungimea, respectiv inaltimea, arcului de cerc.
- "start" reprezinta unghiul de inceput al arcului de cerc, in grade
- "end" reprezinta unghiul de sfarsit al arcului de cerc, in grade. 0o este localizat la pozitia
orei 3, arcul de cerc fiind desenat in sensul acelor ceasornicului.
- "id_culoare" reprezinta identificatorul de culoare folosit pentru culoarea liniei arcului de
cerc (returnat de functia "imagecolorallocate")
Iata un exemplu:
<?php
// setare dimensiuni
$height = 100;
$width = 100;
// definirea imaginii
$im = imagecreate($width, $height);
// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$cerc_color = imagecolorallocate($im, 220, 220, 8);
$arc_color = imagecolorallocate($im, 250, 2, 2);
// crearea imaginii
imagefill($im, 0, 0, $fundal);
imagearc($im, 30, 25, 20, 20, 0, 360, $cerc_color); // primul cerc
imagearc($im, 70, 25, 20, 20, 0, 360, $cerc_color); // al doilea cerc
imagearc($im, 50, 44, 70, 70, 25, 150, $arc_color); // ultimul arc de cerc
// curatarea memoriei
imagedestroy($im);
?>
- Comentariile necesare sunt deja in codul scriptului.
- Functia "imagearc()", folosita de 3 ori, va crea arce de cerc dupa coordonatele dintre paranteze.
(Testati singuri scriptul, modificand valorile argumentelor)
- Rezultatul accestui script este imaginea de mai jos
- Observati ca pot fi create cercuri complete sau arce de cerc, in functie de valoarea in grade a
argumentului sapte ("end").
- Pentru a desena un arc de cerc (sau cerc) cu suprafata colorata, nu doar linia de margine, folositi
functia "imagefilledarc()".
4. Functi a imagecopy()
- Aceasta functie copie o portiune dintr-o imagine data. Sintaxa generala este urmatoarea:
imagecopy("identificator_im2", "identificator_im1", "x2", "y2", "x1", "y1", "width",
"height")
Unde
- "identificator_im2" reprezinta identificatorul celei dea doua imagini, rezultata prin
suprafata copiata
- "identificator_im1" reprezinta identificatorul primei imagini (sursa), din care va fi copiata
portiunea
- "x2" si "y2" reprezinta coordonatele de start (x, y) din cadrul celei dea doua imagini,
punctul de unde va incepe adaugarea imaginii rezultata prin suprafata copiata
- "x1" si "y1" reprezinta coordonatele de start (x, y) din prima imagine, de unde va incepe
copierea (in pixeli, in raport cu marginea din stanga si de sus)
- "width" si "height" reprezinta lungimea, respectiv inaltimea, suprafetei copiate.
Iata un exemplu:
<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng('imgs/marplo.png');
// Copierea suprafetei
imagecopy($im2, $im1, 10, 0, 30, 10, 170, 50);
// datele de iesire
header('Content-Type: image/png');
imagepng($im2);
// eliberarea memoriei
imagedestroy($im2);
imagedestroy($im1);
?>
- "imagecopy()" va copia o suprafata din prima imagine, reprezentata prin "$im1" si o va incadra in
cea dea doua imagine, reprezentata prin "$im2" (conform coordonatelor date).
- Acest script va returna urmatorul rezultat:
5. Functi a imagecopyresized()
- Aceasta functie copie si redimensioneaza o portiune dintr-o imagine data. Sintaxa generala
este urmatoarea:
imagecopyresized("identificator_im2", "identificator_im1", "x2", "y2", "x1", "y1",
"width2", "height2", "width1", "height1")
Unde
- "identificator_im2" reprezinta identificatorul celei dea doua imagini, rezultata cu suprafata
copiata si redimensionata
- "identificator_im1" reprezinta identificatorul primei imagini (sursa), din care va fi copiata
portiunea
- "x2" si "y2" reprezinta coordonatele de start (x, y) din cadrul celei dea doua imagini,
punctul de unde va incepe adaugarea imaginii rezultata prin suprafata copiata si
redimensionata
- "x1" si "y1" reprezinta coordonatele de start (x, y) din prima imagine, de unde va incepe
copierea suprafetei (in pixeli, in raport cu marginea din stanga si de sus)
- "width2" si "height2" reprezinta lungimea, respectiv inaltimea, suprafetei rezultata dupa
redimensionare.
- "width1" si "height1" reprezinta lungimea, respectiv inaltimea, suprafetei copiate.
Iata un exemplu:
<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng('imgs/marplo.png');
// datele de iesire
header('Content-Type: image/png');
imagepng($im2);
// eliberarea memoriei
imagedestroy($im2);
imagedestroy($im1);
?>
- "imagecopyresized()" va copia o suprafata din prima imagine =, reprezentata prin "$im1" si o va
redimensiona si incadra in cea dea doua imagine, reprezentata prin "$im2" (conform coordonatelor
date).
- Acest script va returna urmatorul rezultat:
O lista completa cu functiile care pot fi folosite pentru lucrul cu imagini in PHP gasiti aici Functii
pentru imagini
Pe langa date de tip text sau imagini, cu PHP puteti crea si documente in format PDF (care pot fi
citite cu Adobe Acrobat Reader), utile in special cand se doreste scoaterea la imprimanta a
paginilor.
Pentru crearea documentelor de tip PDF pot fi utilizate functii care folosesc libraria PDFlib. Pentru a
folosi functiile specifice acestei librarii trebuie sa aveti PDFlib instalat si activat in modulul PHP.
Incepand cu versiunea PHP 5 si PDFlib 6 functiile acesteia sunt apelate ca metodele unei clase. Pe
langa faptul ca unele sisteme nu au instalata sau activata aceasta librarie de functii, trebuie sa
tineti cont la scrierea programului si de versiunile PHP si PDFlib pe care le folositi, acest lucru poate
fi mai dificil pentru incepatori. Totusi, daca sunteti interesati gasiti documentatia pentru crearea
documentelor PDF cu PDFlib la pagina creare PDF cu PHP si PDFlib.
O alta modalitate mai simpla de a crea documente PDF cu PHP este folosirea unei clase numite
FDPF. Avantajul este ca aceasta clasa nu necesita instalarea PDFlib si este gratuita. Aveti nevoie
doar de fisierul PHP care contine clasa FPDF si un director cu fonturile pe care le puteti folosi in
documentul PDF, acestea le puteti descarca de aici Download Clasa FPDF sau de pe site-ul
oficial www.fpdf.org.
Documentatia si tutorialele in limba engleza le puteti descarca si de aici -> Documentatie Clasa
FPDF.
Aceasta lectie are doua parti, in prima parte, aici, voi explica lucrile de baza (pentru incepatori) in
crearea documente PDF folosind class FPDF, iar in partea a doua sunt prezentate cateva metode
mai avansate.
Pentru ca documentul PDF creat sa poata fi vizualizat de browser sau descarcat, browser-ul clientului
trebuie sa aibe instalat plug-in-ul pentru Adobe Reader.
Cand continutul pe care doriti sa-l afisati in pagina PDF depsaseste inaltimea acesteia, se va genera
automat o pagina noua.
Iata un exemplu simplu in care este creata o pagina PDF si in ea un text.
<?php
include('fpdf.php');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Text(25,40,'Prima pagina PDF.');
$pdf->Output();
?>
- Dupa includerea fisierului cu clasa FPDF 'fpdf.php' am definit obiectul FPDF() stocat in variabila
"$pdf", cu aceasta se va apela metodele clasei.
- Odata obiectul creat, am initializat crearea paginii cu "$pdf->AddPage()", apoi am setat fontul
apeland metoda specifica "$pdf->SetFont('Arial','B',16)" - primul argument este numele fontului, al
doilea este pentru stil (B-bold, I-italic, U-underline, null-normal).
- In continuare am apelat metoda Text() pentru crearea textului, aceasta preia 3 argumente: primul
argument reprezinta distanta X fata de marginea din stanga (aici 25), al doilea argument reprezinta
distanta Y fata de marginea de sus (aici 40) si ultimul este textul care va apare in pagina PDF.
- Dupa ce am definit toate aceste elemente, apelam metoda Output(), fara atribute, care trimite
datele de iesire pentru afisarea documentului PDF.
- Daca doriti salvarea acestuia pe server, apelati aceasta metoda astfel $pdf->Output('fisier.pdf',
'F'); (in acest caz, PHP trebuie sa aibe permisiuni de creare fisiere pe server). Daca doriti ca
utilizatorului sa-i apara optiunea de download, apelati aceasta metoda asa: $pdf-
>Output('fisier.pdf', 'D'); (fisierul nu va fi salvat si pe server).
- Puteti vedea rezultatele acestui exemplu aici -> Demo 1.
In documentatia FPDF gasiti metodele pe care aceasta clasa le poate folosi, rolul lor si argumentele
pe care le preia fiecare.
- La urma am apelat metoda Output() care trimite datele de iesire pentru afisare.
Rezultatul acestui exemplu il puteti vedea aici -> Demo 2.
• Linie
Clasa FPDF are si o metoda pe care o puteti folosi pentru trasarea de linii in pagina, aceasta este
metoda line() si are urmatoarea sintaxa:
Line(x1, y1, x2, y2)
- unde "x1" si "y1" sunt coordonatele X si Y pentru punctul de inceput a liniei, iar "x2" si "y2" sunt
coordonatele X si Y pentru punctul de sfarsit a liniei
• Imagine
Pe langa date de tip text sau linii, in pagiina PDF puteti adauga cu FPDF si imagini JPEG, PNG sau
GIF; pentru aceasta se foloseste metoda Image() care are urmatoarea sintaxa:
Image(src, x, y, w, h, tip, url)
- unde "src" este adresa imaginii, aceasta este singura strict necesara, restul sunt optionale.
- "x" si "y" sunt coordonatele X si Y pentru coltul din stanga-sus de unde incepe afisarea imaginii,
daca nu sunt specificate se folosesc coordonatele curente.
- "w" si "h" reprezinta dimensiunile (lungime, inaltime) in care va fi afisata imaginea in pagina, daca
nu sunt specificate se folosesc dimensiunile imaginii.
- "tip" este tipul imaginii (JPG, JPEG, PNG sau GIF), daca nu e adaugat se preia din extensia acesteia,
iar "url" este o adresa URL care poate fi deschisa la click pe imaginea respectiva.
• Link
Sunt mai multe metode, simple sau mai complexe, de a adauga un link in pagina PDF. Aici veti
vedea doua metode simple, pentru ceva mai complicat studiati tutorialul din documentatia FPDF.
Cea mai simpla metoda e sa scrieti direct adresa URL in continutul textului (vedeti in exemplul de
jos), in pagina va apare adresa asa cum ati scris-o iar cand se da click pe ea deschide acea adresa.
O alta metoda pe care o puteti folosi e sa adaugati adresa in atributul URL a uneia din metodele:
Cell(), Write() sau Image().
Codul din urmatorul exemplu va afisa o pagina PDF in care este un continut text pe mai multe linii
care are si o adresa URL, urmat de un link intr-o celula, doua linii si o imagine.
<?php
include('fpdf.php'); // Include clasa FPDF
// Sirul ce contine textul cu mai multe linii, care va fi adaugat in metoda Write()
$sir ="Text adaugat cu metoda Write() \r\n Linie noua din cadrul aceluiasi sir, \r\n O alta linie care contine
si un link www.marplo.net/php-mysql";
// Adaugarea liniilor
$pdf->SetDrawColor(90,100,200); // Seteaza culoarea pt. linie
$pdf->SetLineWidth(1); // Defineste grosimea liniei
$pdf->line(80,70,100,45); // Deseneaza prima linie
$pdf->line(100,45,120,70); // Deseneaza a doua linie
In partea a doua a acestei lectii veti invata cum sa adaugati elemente mai avansate in documentul
PDF, cum sunt: Header, nr. pagini, tabele sau contint realizat prin recunoasterea unor tag-uri HTML
FTP (File Transfer Protocol) este un protocol standard care realizeaza o conexiune client-server
pentru transfer si manipulare de fisiere prin Internet.
Cu ajutorul FTP puteti adauga si copia fisiere (si directoare) de pe server sau sa le schimbati
permisiunile CHMOD. PHP are functii speciale pentru conectarea la server si lucrul cu FTP.
1. Conectarea la server
Pentru conectarea la server prin FTP sunt necesare 3 date importante: adresa serverului (a
domeniului), numele de utilizator si parola de conectare prin FTP.
La inceput se deschide o conexiune cu serverul, folosind functia ftp_connect(), aceasta preia ca
argument necesar numele serverului, care de obicei are forma "ftp.server" ("server" poate fi
numele domeniului sau adresa IP a acestuia). Daca deschiderea conexiunii s-a efectuat, functia va
returna un ID a conexiunii, in caz contrar returneaza FALSE.
Dupa deschiderea conexiunii se face autentificarea pe server, pentru aceasta se foloseste
functia ftp_login() care are urmatoarea sintaxa:
ftp_login(conn_id, nume_user, parola)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "nume_user" este numele de utilizator pentru conectare la FTP, iar "parola" este parola
utilizatorului.
Pentru inchiderea conectarii se foloseste functia ftp_close(), aceasta preia ca argument id-ul
conexiunii.
// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca s-a efectuat cu succes conectarea si autentificarea pe server, va afisa mesajul de confirmare,
in caz contrar apare mesajul de eroare.
- La urma, "ftp_close($conn_id);" inchide conexiunea si elibereaza memoria alocata.
Conectarea la server folosind codul de mai sus este primul pas, dupa aceasta puteti folosi functiile
PHP specifice FTP pentru a efectua diferite operatii, cum sunt: preluarea continutului directoarelor,
incarcarea sau descarcarea de fisiere, crearea de noi directoare sau modificarea permisiunilor
CHMOD.
2. Preluarea conti nutului directoarelor
Pentru a prelua continutul unui director (numele fisierelor si directoarelor din el) se foloseste
functia
ftp_nlist(conn_id, director)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "director" este numele directorului a carui continut va fi preluat
Aceasta functie returneaza o matrice secventiala a carei elemente sunt numele fiecarui director si
fisier din catalogul cautat.
Mai jos este un exemplu practic.
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site'; // Poate fi de exemplu
'ftp.marplo.net'
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Executa conectarea
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
// Inchide conexiunea
ftp_close($conn_id);
?>
- Dupa setarea conexiunii si autentificarea pe server, daca conectarea a reusit este apelata functia
"ftp_nlist()", care va stoca in variabila "$continut" matricea cu numele cataloagelor si fisierelor din
directorul radacina (precizat de argumentul ".").
Daca doriti obtinerea datelor din alt director, de exemplu "www", puteti apela functia
asa: ftp_nlist($conn_id, '/www').
- Pentru afisarea (sau preluarea) numelui fiecarui fisier si director returnat se parcurge matricea
"$continut".
Rezultatul afisat de acest script va fi ceva similar cu cel de jos:
cgi-bin
private
public_html
statistics
www
Iata un exemplu in care se copie un fisier de pe calculatorul client pe server, in directorul 'www':
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Executa conectarea
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer prin FTP, fisierul
"test.txt" (aflat pe calculatorul client in directorul "c:/wamp/www/site/") va fi copiat pe server, in
directorul "www/".
- Fisierul va fi incarcat cu acelasi nume, daca doriti sa fie transferat pe server cu alt nume, modificati
la "$destinatie".
Iata un exemplu in care se descarca prin FTP un fisier de pe server pe calculatorul client:
<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Executa conectarea
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer prin FTP, fisierul
"test.txt" (aflat pe server in directorul "www/") va fi copiat pe calculatorul client, in directorul
"c:/download/".
- Fisierul va fi copiatat cu acelasi nume, daca doriti sa fie descarcat pe calculator cu alt nume,
modificati la "$client". Daca in directorul unde va fi copiat se mai afla un fisier cu acelasi nume,
acesta va fi inlocuit cu cel descarcat de pe server.
Pentru crearea unui director pe server prin FTP se foloseste functia ftp_mkdir(), in caz de succes
returneaza numele noului director creat, iar in caz contrar returneaza FALSE. Are urmatoarea
sintaxa:
ftp_mkdir(conn_id, nume_dir)
- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()"
- "nume_dir" este numele noului director
// Executa conectarea
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
// Inchide conexiunea
ftp_close($conn_id);
?>
- Daca datele pentru conectare sunt corecte si directorul curent de lucru (www/) este setat cu succes
iar PHP are permisiuni de scriere pe server, in catalogul "www/" va fi creat directorul "un_director".
Pentru stergerea unui director se foloseste functia ftp_rmdir(conn_id, del_dir), unde "conn_id" este
id-ul conexiunii iar "del_dir" este numele directorului care va fi sters.
Iata un exemplu in care este preluata o parte din continutul unui fisier si transferata intr-un fisier
pe server:
<?php
$fisier = "test.txt"; // Fisierul care va fi deschis pt. citire
// Executa conectarea
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
// Inchide conexiunea
ftp_close($conn_id);
- Daca fisierul "test.txt" a fost deschis pentru citire, functia "fseek($fp, 40)" muta pointer-ul la pozitia
40, astfel va fi retinut continutul din fisier care incepa de la caracterul 41 pana la sfarsit (primul
caracter are pozitia 0).
- In continuare, daca s-a efectuat cu succes conexiunea si autentificarea prin FTP, se transfera
continutul in fisierul "test2.txt" din directorul "www" de pe server (daca fisierul "test2.txt" exista
deja pe server, continutul lui va fi inlocuit cu cel transferat).
In cazul in care doriti sa transferati intreg continutul unui fisier deschis cu "fopen()", nu este necesara
utilizarea funtiei "fseek()".
Aceasta metoda este utila cand doriti sa adaugati un sir sau continut, de exemplu preluat dintr-un
form, pe server prin FTP. Adaugati sirul intr-un fisier temporar pe care apoi il deschideti cu "fopen()"
si transferati continutul cu "ftp_fput()".
Pentru stergerea unui fisier se foloseste functia ftp_delete(conn_id, 'cale/fisier'), unde "conn_id"
este id-ul conexiunii iar "cale/fisier" este calea si numele fisierului care va fi sters.
O lista completa cu functiile PHP pentru FTP gasiti la adresa din urmatorul link Functii PHP
pentru FTP
1. Structura site-ului
Site-ul va contine:
un fisier principal "index.php",
un alt fisier PHP, denumit "admin.php" in care e stocata matricea cu paginile site-ului,
continand datele acestora: nume, titlu, descriere si cuvinte cheie,
un fisier pentru stilurile CSS, denumit "grafic.css", in care e definit designul paginilor,
un director "pagini" in care sunt adaugate fisierele pentru continutul specific fiecarei pagini.
Ca exemplu, voi crea un model de site simplu de prezentare, cu urmatoarele pagini: 'Despre mine',
'Favorite', 'Poze' siContact. La Poze va fi 3 submeniuri: Familie, Prieteni si Natura.
In continuare iata codul complet pentru fiecare fisier, explicatiile necesare le gasiti in documentatia
adaugata.
De asemenea, puteti descarca arhiva cu fisierele acestui exemplu de aici -> Creare Site.
- Fisierul admin.php
<?php
// Datele initiale pt. HEAD ale pagini "index"
$titlu = 'Titlul paginii index';
$desc = 'Descrierea pentru pagina index';
$keys = 'cuvnte, cheie, pagina, index';
/*** Matricea cu datele despre paginile adaugate in site, care apar in
"context" ***/
$pags['despre_mine'] = array(
'titl'=>'Titlul paginii Despre Mine',
'desc'=>'Descrierea paginii Despre Mine',
'keys'=>'cuvinte, cheie, despre, mine'
);
$pags['favorite'] = array(
'titl'=>'Titlul paginii Favorite',
'desc'=>'Descrierea paginii Favorite',
'keys'=>'cuvinte, cheie, favorite'
);
$pags['poze'] = array(
'familie'=>array(
'titl'=>'Titlul pt. pagina Poze Familie',
'desc'=>'Descriere pt. pagina Poze Familie',
'keys'=>'cuvinte, cheie, poze, familie'
),
'prieteni'=>array(
'titl'=>'Titlul pt. pagina Poze Prieteni',
'desc'=>'Descriere pt. pagina Poze Prieteni',
'keys'=>'cuvinte, cheie, poze, prieteni'
),
'natura'=>array(
'titl'=>'Titlul pt. pagina Poze Natura',
'desc'=>'Descriere pt. pagina Poze Natura',
'keys'=>'cuvinte, cheie, poze, natura'
)
);
$pags['contact'] = array(
'titl'=>'Titlul paginii Contact',
'desc'=>'Descrierea paginii Contact',
'keys'=>'cuvinte, cheie, contact'
);
// Daca doriti sa adaugati alte meniuri sau submeniuri pt. alte pagini
de site
// Adaugati in continuare, comform modelului de mai sus
// De asemenea, trebuie sa adaugati in dir. "pagini" fisierul ce contine
contextul afisat de acel meniu
?>
- Fisierul index.php
<?php
// Exemplu creare site cu PHP, de la http://www.marplo.net
ini_set('display_errors',1);
error_reporting(E_ALL);
// Include fisierul "admin.php", in care e matricea cu datele fiecarei
pagini
include('admin.php');
/*** Crearea variabilei ce contine codul HTML pt. meniu, cu paginile din
matrice ***/
// Verifica daca sunt primite date prin GET si daca acestea se afla in
matrice
// Creaza variabilele pt. meta-tags si continutul ce va fi inclus
if (isset($_GET['id']) && isset($pags[urldecode(trim($_GET['id']))])) {
$pg = urldecode(trim($_GET['id'])); // Numele paginii,
decodificat URL, care va fi inclusa pt. continut
$obj = $pags[$pg]; // Obiectul cu datele despre pagina
</body>
</html>
- Fisierul grafic.css
body {
margin:0px auto;
width:1000px;
background-color:#e8e8fe;
text-align:center;
}
- Pe langa aceste fisiere, creati un director "pagini" in care adaugati fisierele ce au continutul specific
pentru fiecare link din meniu, si care apare in zona "context".
Important
- Numele fisierelor pe care le adaugati in directorul "pagini" (pt. continut din context) trebuie sa fie
acelasi cu numele cheii din elementul matricei "$pags[]" pentru pagina respectiva.
- Numele din Meniu care va contine subdomeniu trebuie sa fie diferit de cheile: titl, desc si keys.
- Ordinea afisarii numelor in meniu este aceeasi cu cea a elementelor din matrice.
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z_]+).html$ index.php?id=$1 [NC,L]
RewriteRule ^([a-zA-Z_]+)-([a-zA-Z_]+).html$ index.php?id=$1&sm=$2 [NC,L]
- Link-urile vor avea forma "nume_pagina.html",
- iar pentru cele cu submeniu vor avea forma "meniu-nume_pagina.html".
In script-ul PHP din "index.php", unde este generat codul pentru meniu, trebuie efectuate
urmatoarele doua modificari:
In loc de
$link = '<a href="index.php?id='. urlencode($kei).'" title="'. $pagini['titl']. '">'. str_replace('_', ' ',
ucfirst($kei)). '</a>';
Scrieti
$link = '<a href="'. urlencode($kei).'.html" title="'. $pagini['titl']. '">'. str_replace('_', ' ', ucfirst($kei)).
'</a>';
Iar pentru submeniuri, inlocuiti
$link = '<a href="index.php?id='. urlencode($kei). '&sm='. urlencode($kei2).'" title="'. $pagini2['titl'].
'">'. str_replace('_', ' ', ucfirst($kei2)). '</a>';
Cu
$link = '<a href="'. urlencode($kei). '-'. urlencode($kei2).'.html" title="'. $pagini2['titl']. '">'. str_replace('_',
' ', ucfirst($kei2)). '</a>';
Sau puteti descarca versiunea cu mod-rewrite a acestui exemplu de aici -> Creare Site 2.
Daca studiati codul HTML al paginilor, generat de PHP, veti intelege mai bine rolul datelor din
matrice si ce face scriptul PHP.
Codul paginii poate fi vazut, daca folositi Mozilla Firefox, din meniul View -> Page Source.
Creare site cu PHP si MySQL - CMS
In aceasta lectie puteti invata cum sa creati un site de la zero, care foloseste si baza de date
MySQL. Trebuie sa aveti cel putin cunostintele de baza despre PHP, MySQL, HTML si CSS.
Datele despre numele paginilor, titlu, cuvinte cheie si descriere vor fi stocate intr-un tabel dintr-o
baza de date MySQL, iar continutul fiecarei pagini va fi salvat in fisiere intr-un director pe server.
Toate aceste date vor putea fi adaugate sau stere dintr-o pagina de administrare.
Acest sistem de script pentru site se mai numeste si CMS, acronim de la Content Management
System, o colectie de proceduri prin care continutul, paginile site-ului, pot fi adaugate, sterse si
modificate automat dintr-o pagina de administrare.
Exemplul din aceast tutorial este un fel de CMS mai simplu, care da posibilitatea de a adauga in
site: categorii, meniuri si continut, precum si stergerea lor din pagina de Admin. Pentru a nu
complica prea mult scriptul si necesitatea explicatiilor, nu am adaugat si o procedura de modificare.
Ideea fiind sa puteti invata esentialul in modul de creare a unui site cu PHP si MySQL. Continutul
paginilor il puteti apoi modifica din fisierele in care a fost salvat.
Accentul este pus pe partea de programare, grafica site-ului pentru modelul prezentat aici o face
fiecare. Sistemul permite usor crearea si folosirea unui template HTML
Daca doriti sa invatati cum sa creati un script de site CMS, va sfatuiesc sa cititi cu atentie acest
tutorial si sa scrieti personal scriptul din fiecare fisier, dupa codul prezentat in continuare pentru
fiecare. Daca doar vreti sa folositi acest model pentru a-l adapta si dezvolta, descarcati arhiva cu
tot scriptul si studiati documentatia din el.
- Scriptul complet il puteti descarca de aici -> Creare site - CMS.
In fisierele scriptului gasiti explicatiile necesare intelegeri fiecarei linii de cod si la ce sunt folosite. In
acest tutorial este explicat in mare structura si logica scriptului.
1. Structura site-ului
Inainte de a incepe crearea unui site, trebuie stabilita structura acestuia, care consta din 3
elemente principale (daca folosim si baza de date):
- structura tabelului (tabelelor) din baza de date.
- structura fisierelor si directoarelor pe server.
- structura paginii (paginilor) siteului, layout-ul.
Luam pe fiecare in parte.
Pentru exemplu de site, relativ simplu, din aceasa lectie, este folosit un singur tabel MySQL, care
are urmatoarele coloane:
- id - o coloana de tip INTEGER AUTO_INCREMENT, care va avea un 'id' (numar) unic pentru
fiecare pagina adaugata.
- meniu - unde e inregistrat numele meniurilor principale (categoria careia apartine pagina).
- pagina - pentru numele care-l are fisierul ce contine contextul paginii respective.
- titlu - in care e stocat titlul ce va fi adaugat in sectiunea HEAD, folosit si pt. formarea numelui
si URL-ul paginii
- descriere - pentru descrierea din meta-tag "description".
- cuv_key - pentru cuvintele cheie care vor fi adaugate la fiecare pagina in meta-tag
"keywords".
- data - pentru inregistrarea datei (in format UNIX) la care sunt adaugate paginile.
La structura de pe server sunt folosite 5 fisiere principale si un director pentru stocarea fisierelor
unde va fi salvat continutul fiecarei pagini (vor fi prezentate fiecare mai tarziu).
Aceasta e pe scurt structura site-ului, in continuare creem pe rand fiecare din aceste elemente.
- Fisierul creaza_tabel.php
<?php
// Seteaza utilizarea formatului UTF-8
header("Content-type: text/html; charset=utf-8");
- Fisierul admin.php
<?php
// De la http://www.marplo.net/php-mysql/
// Datele pt. autentuificare Administrator
// Necesare in pagina pt. adaugare si stergere pagini in site
$admin = 'admin';
$pass = 'pass';
return $var;
}
4. Protejarea fi sierului
Deoarece in "admin.php" sunt datele importante pentru conectare la baza de date si
autentificare administrator, este indicat sa asiguram o protetie sporita acestui fisier. Pentru aceasta
folosim .htaccess ca sa blocam accesul extern la el.
Deschideti un editor simplu de text si scrieti in el codul de ma jos, apoi salvati-l in format ASCII cu
denumirea .htaccess, fara alta extensie, in acelasi loc unde e si "admin.php".
# Blocheaza accesul extern la admin.php
<files admin.php>
order allow,deny
deny from all
</files>
Sau o alta metoda ar fi sa mutati fisierul "admin.php" intr-un director de pe server, care nu poate fi
accesat din browser. In acest caz trebuie sa modificati si calea de includere a lui.
- In partea a doua a acestui tutorial gasiti explicatii despre fisierul de administrare si management
date, prin care se va putea adauga si sterge paginile site-ului.
- In partea a treia sunt prezentate fisierele "index.php" si "grafic.css"
Creare site cu PHP si MySQL - CMS - Pa rt . 3
Aici, in a treia parte din acest tutorial sunt prezentate fisierele "index.php" si "grafic.css".
index.php - e fisierul care afiseaza continutul site-ului. In partea de sus a paginilor sunt afisate
categoriile, meniurile principale din site. Iar in corpul paginii: in partea stanga e un meniu in care
sunt afisate link-urile paginilor corespunzatoare fiecarei categorii si in centru se afiseaza continutul
celei accesate.
Acest fisier trebuie creat in directorul root al site-ului (www sau httpdocs). In el sunt 2 categorii
distincte de cod: scriptul PHP si codul HTML cu layout-ul site-ului.
Scriptul PHP include la inceput fisierul "admin.php", dupa care sunt definite variabilele cu datele
initiale care vor fi incluse in codul HTML, pentru meniuri, nume pagina, titlul, descrierea si cuvintele
cheie, apoi, in functie de pagina apelata, aceste date sunt modificate cu cele care apartin paginii
respective, si care sunt preluate din MySQL.
O alta treaba pe care trebuie sa o faca scriptul din acest fisier este crearea link-urilor pentru
meniuri si pagini. Adauga numele paginilor preluate din tabelul MySQL intr-o matrice, apoi
parcurge aceasta matrice si formeaza cate un link cu fiecare nume, avand adresa URL de forma
"index.php?p=nume_pagina". Astfel, ca sa stie ce pagina sa fie afisata cand e accesat un link,
scriptul verifica valoarea variabilei $_GET['p'], care e numele paginii si care a fost folosit atat in
tabelul MySQL cat si la fisierul in care e salvat continutul iei.
Ultima operatie din acest script e definirea meniului cu principalele categorii, care sunt afisate in
top-ul paginii. Pentru aceasta se foloseste functia "get_meniu()" din "admin.php", datele returnate
de aceasta fiind o matrice cu numele categoriilor. Se parcurge aceasta matrice si fiecare nume e
adaugat in cod HTML.
Dupa scriptul PHP urmeaza codul HTML cu template-ul site-ului. Acesta preia variabilele setate in
script, pentru titlu, descriere, cuvinte cheie, meniu principal, paginile din meniul curent si numele
fisierului in care e continutul ce trebuie afisat. Aceste variabile au nume fixe, oricare ar fi pagina
accesata, si datele din ele pot fi afisate cu instructiunea "echo", astfel, puteti modifica oricand
template-ul site-ului si sa schimbati locul afisarii acestor elemente dupa cum doriti.
Veti observa ca scriptul complet din acest tutorial nu are si o grafica definita (doar superficial), asta
o face fiecare dupa cum vrea, obiectul acestei lectii fiind partea de programare PHP.
Iata si codul complet din "index.php"
- Fisierul index.php
<?php
// Exemplu creare site cu PHP, de la http://www.marplo.net
// Seteaza optiunea de a afisa orice eroare care apare in executia
scriptului
ini_set('display_errors',1);
error_reporting(E_ALL);
</body>
</html>
Ultimul fisier din acest script gen CMS este cel care se ocupa de grafica site-ului. L-am denumit
"grafic.css" si contine doar cateva coduri CSS pentru o structura de baza a cadrelor din pagina.
Acest fisier este apelat in sectiunea HEAD a codului HTML din "index.php".
- Fisierul grafic.css
body {
margin:0px auto;
width:1000px;
background-color:#e8e8fe;
text-align:center;
}
/* Grafica pentru sectiunea Top */
#top {
margin:2px auto;
position:relative;
border:1px solid #ceceda;
background-color:#dedeee;
}