Scrierea Scripturilor PHP Element Are
Scrierea Scripturilor PHP Element Are
Invatati sa creati un script PHP cu cele mai simple instructiuni PHP Invatati sa documentati si sa executati un script PHP Un script PHP poate fi foarte simplu sau foarte complex. Totusi, scrierea chiar si a unui script PHP complex este relativ simpla, necesitand doar un editor de texte obisnuit. In aceasta lectie veti invata modul de creare si de executare a programelor PHP, veti invata sa creati scripturi PHP simple, care afiseaza in navigatorul web un text simplu. De asemenea, veti invata sa va documentati scripturile, astfel incat dumneavoastra si alte persoane sa puteti intelege rapid scopul si structura acestora. Mai intai trebuie sa instalati un server web (Apache) si modulul pt. limbajul PHP, acestea sunt gratuite, le puteti gasi pe net si instala pe fiecare, dar pentru incepatori e recomandat un program care le are deja configurate (si cu MySQL), precum WampServer, sau sa incarcati scriptul pe un server web unde este instalat PHP. Daca nu aveti deja instalat PHP, descarcati de aici -> WampServer, dezarhivati si instalati programul. (cand este pornit, veti observa o iconita specifica in colltul cu ceasul). Fisierele .php in care veti scrie scripturile trebuie sa le salvati in directorul www din "wamp", apoi, ca sa le testati scrieti in browser adresa http://localhost/fisier.php
Asigurati-va ca ati ales un nume semnificativ, care sa descrie functia scriptului dumneavoastra, astfel incat sa-l puteti identifica rapid dupa saptamani sau chiar luni de la crearea acestuia. Veti descoperi ca liniutele sunt utile pentru separarea cuvintelor care alcatuiesc numele fisierului, marind astfel lizibilitatea acestuia. De exemplu, un fisier care contine un script PHP ce va permite sa vizualizati salariile angajatilor poate primi numele "saarii-angajati.php". Chiar si la mult timp dupa crearea fisierului respectiv, nu veti avea probleme in a determina scopul acestuia.
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.php si 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 : Exemplu de script PHP inclus in HTML Pot fi incluse si scripturi mai complicate ce contin zeci sau chiar sute de linii, atata timp cat acestea sunt incluse intre cele doua linii specifice limbajului PHP: <?php ?>
<title>Test PHP</title> </head> <body> <?php // Script test // Acest script afiseaza un mesaj vizibil pentru utilizator. echo "Primul meu script PHP."; ?> </body> </html> Salvati fisierul cu numele 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 testscript.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/testscript.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.
catre operatorul uman. Datele trebuie stocate sub forma de siruri daca formatul acestora nu este numeric sau daca doriti ca operatorul uman sa fie capabil de a introduce sau de a vizualiza datele. Practic, puteti asimila numerele cu un mod de stocare a datelor n interiorul calculatorului. Sirurile se pot asimila unui mod de stocare a datelor n afara calculatorului. Aceste doua mari categorii de date: numere si siruri, formeaza opt tipuri principale de variabile :
- Boolean - Integer - Float - String - Array - Object - Resource - Null In mod normal tipul variabilelor nu este specificat explicit; acesta va fi evaluat de catre interpretorul PHP la momentul run-time (in momentul executarii scriptului).
1. Tipul boolean
Variabilelele de tipul boolean pot lua doar doua valori : FALSE sau TRUE Variabilele de alt tip decat boolean pot fi convertite la tipul boolean prin operatorul cast (bool) sau (boolean), plasate inaintea valorilor, desi in general nu e nevoie de aceasta converrire, valoarea fiind automat recunoscuta de PHP. 2. Tipul integer
PHP foloseste doua categorii de numere: ntregi (tipul integer) si duble, cu virgula (tipul float) Variabilele integer reprezinta numerele intregi, ele pot fi specificate in format zecimal, hexazecimal sau octal. Numerele ntregi reprezinta numerele fara parte fractionara folosite la numarare, plus zero si numerele negative. Cu alte cuvinte, n PHP termenul de ntreg are aceeasi semnificatie ca si n matematica. De exemplu, numarul 100 poate fi reprezentat n PHP sub forma de ntreg. Scrierea numerelor PHP este simpla. Un ntreg PHP se obtine prin scrierea cifrelor care i alcatuiesc valoarea. Daca valoarea este negativa, scrieti un semn minus imediat la stnga numarului. Evitati sa scrieti spatii sau virgule ca parte a unui ntreg PHP. Iata cteva exemple de numere PHP ntregi : 215678 - Numar in reprezentare zecimala 0x1A8; - Numar in reprezentare hexazecimala (reprezinta: 1*16*16 + 10*16 + 8 = 424 (in zecimal)) 067 - Reprezinta: 6*8 + 7 = 55 (in zecimal) Valorile minime, respectiv maxime pe care le poate lua o variabila de tip integer depind de sistemul de operare pe care ruleaza modulul PHP. De exemplu pentru un sistem Windows valoarea unui integer se memoreaza pe 32 de biti: 31 bit pentru numar si un bit pentru semn. In acest caz valorile unui intreg se afla in intervalul :-213 repectiv: 213. Daca incercam sa folosim un integer cu valori care ies din acest inteval vor avea de-a face cu un fenomen de
depasire : integer overflow. In acest caz interpretorul PHP converteste acesta valoare intr-o valoare de tip float (care are un interval mai extins de valori). In PHP simpla impartire a doua valori intregi va produce ca rezultat o variabila de tip float. Pentru a obtine doar partea intreaga acestui rezultat putem folosi operatorul cast (int) in fata rezultatului. Ex.: echo (int)8.7; (va returna 8) Pentru a rotunji rezultatul la intregul cel mai apropiat de valoarea reala se poate folosi functia round(), unde intre paranteze se adauga valoarea. Ex.: echo round(8.7); (va returna 9) 3. Tipul float
Reprezinta variabile de tip real [numerele cu virgula], (n lb. engleza se foloseste punctul zecimal n loc de virgula). De exemplu 2.5 In general, numerele duble (tipul float) sunt stocate folosindu-se formatul standard IEEE-64, care furnizeaza 64 de biti. Acest format va permite sa stocati valori care pot merge pna la 1,8 x 10 la puterea 308 sub forma de numere duble si furnizeaza aproximativ 14 cifre dupa punctul zecimal (sau cifre semnificative) de precizie. Iata cteva exemple de numere duble (tipul float)
123.4567 1.2e3;
4. Tipul string
Reprezinta o insiruire de caractere, fiecare caracter este memorat pe 1 byte; setul de caractere este limitat la 256 valori distincte. Dimensiunea sirurilor poate fi oricat de mare in PHP, nu exista specificatii care sa limiteze numarul maxim de caractere dintr-un sir. Spre deosebire de ntregi si de numere float, care contin cifre, sirurile pot contine orice caracter. Ca atare, sirurile sunt utile pentru stocarea datelor care nu pot fi calculate, precum nume, fraze si adrese. In PHP, un sir poate fi declarat in mai multe feluri: 1) Un mod simplu de a declara un sir este prin delimitarea cu ghilimele simple (' ') Daca dorim ca sirul sa contina caracterul ' va trebui sa inseram inaintea lui caracterul escape \. Daca dorim ca sirul sa contina caracterul \ va trebui sa dublam acest caracter. Acest comportament este exemplificat in exemplul urmator: <?php $var1 = 'Acesta este un sir de test'; echo 'Curs \'PHP\''; echo '<br />Vrei sa stergi C:\\*.* ?'; echo '<br />Variabila var1=$var1'; echo "<br />Variabila var1=$var1"; ?> In browser va aparea: Curs 'PHP' Vrei sa stergi C:\*.* ? Variabila var1=$var1 Variabila var1=Acesta este un sir de test
Observati diferenta dintre ultimile doua linii! In penultima linie, unde s-a folosit gilimele simple pentru delimitarea sirului, variabila $var1 nu este expandata adica nu este afisat valoarea variabilei var1=Acesta este un sir de test ci exact textul scris (numele ei). Pentru a realiza afisarea valorii variabilei si nu numele acesteia, se folosesc ghilimelele duble, precum in ultima linie a exemplului de mai sus. 2) O alta metoda pentru a specifica un sir n PHP este prin folosirea ghiimelelor duble (" "). Daca intr-un sir delimitat prin ghilimele duble vrem ca acesta sa afiseze numele unei variabile, nu valoarea acesteia, adaugam un caracter backslash (\) inaintea numelui variabiei. Exemplu; echo "Numele variabilei este \$var"; Acest cod va afisa Numele variabilei este $var, oricare ar fi valoarea variabilei "$var". Caracterele care alcatuiesc sirul sunt incluse ntre ghilimele duble (" "); De exemplu, sirul reprezentnd numele fizicianului care a formulat teoria relativitatii este "Albert Einstein". Asa cum s-a explicat, un sir poate contine date numerice; de exemplu, "3.14159". Daca se doreste adaugarea de ghilimele duble intr-un sir delimitat de ghilimele duble, se adauga caracterul \ in fata acestora. Exemplu; echo "Numele programului este \"PHP\"."; Prin delimitarea cu ghilimele duble PHP faciliteaza includerea n siruri a unor caractere speciale, precum caracterele de salt la linie noua sau retur de car, prin furnizarea de secvente escape care reprezinta caractere speciale. Iata secventele escape folosite n PHP:
\n - salt la linie noua \r - retur de car (rand nou) \t - caracter de tabulare pe orizontala \\ - backslash \$ - simbolul dolarului \ - ghilimele duble
Ca exemplu, iata un sir care include un retur de car, urmat de un salt la linie noua: "Salut, lume!\r\n". Retineti ca fiecare secventa escape ncepe cu un backslash (\). Pentru a include un backslash ntr-un sir, trebuie sa folositi doua caractere backslash. Pe langa imbricarea variabilelor in cadrul sirurilor delimitate prin ghilimele duble, PHP pune la dispozitie operatorul de concatenare a sirurilor: . (punct) . Acest operator adauga un sir la sfarsitul altui sir. De exemplu: <?php $nume = 'Popescu'; $prenume='Costel'; echo 'Numele de familie este '.$nume. 'iar prenumele este '.$prenume; ?> In browser va aparea: Numele de familie este Popescu iar prenumele este Costel In anumite situatii este necesar sa accesam unul dintre caracterele unui sir. Pentru aceasta putem folosi parantezele{} ca in exemplul de mai jos:
<?php $var1 = 'Acesta este un sir de test'; echo $var1{0}; // Afisaza A (primul caracter din sir) echo $var1{2}; // Afisaza e (al treilea caracter din sir) ?> Rezultatul afisat va fi Ae 3) Sintaxa heredoc este o alta modalitate de a delimita siruri In acest caz delimitatorul este ("<<<"); acesta trebuie urmat de un identificator unic, dupa care urmeaza sirul de caractere, iar secventa se incheie din nou cu identificatorul mentionat. Identificatorul de incheiere trebuie sa se afle in prima coloana a liniei, acesta poate contine caractere alfanumerice dar neaparat trebuie sa inceapa cu o litera, nu cu o cifra sau alt semn. Veti intelege mai bine studiind exemplu de mai jos: <?php $var1 = <<< EOT Exemplu de sir care foloseste delimitatorul heredoc. EOT; echo $var1; ?> Rezultatul afisat va fi: Exemplu de sir care foloseste delimitatorul heredoc. 5. Tipul array
Reprezinta un vector de valori (care creaza o matrice, vezi Lectia 9 despre matrice), fiecare element al matricei are asociat o cheie. Aceasta cheie va fi folosita ulterior la identificarea unui element specific at matricei. In PHP tipul array se mai numeste si tip map ordonat, deoarece elemente vectorului sunt ordonate dupa campul cheie. Variabilele de tip array si lucrul cu acestea vor fi prezentate mai detaliat in lectiile urmatoare. Iata un exemplu simplu de variabile array: <?php $fructe[0] = 'mere'; $fructe[1] = 'caise'; $fructe[2] = 'piersici'; ?> 6. Tipul object
Reprezinta de fapt instanta unei clase declarate in PHP. O clasa este o structura care contine variabile membru si functii membru. Variabilele de tip object si lucrul cu acestea vor fi prezentate detaliat in lectiile urmatoare. 7. Tipul resource
Este un tip special de variabila care pastreaza o legatura spre resurse externe. Exemple de resurse externe: manipulatori pentru deschidere de fisiere, conectare la baze de date, compresia fisierelor, resurse COM, etc...
8. Tipul NULL
Reprezinta varibilele care nu au inca atribuita o valoare. O variabila se considera a avea valoarea Null daca: - este setata explicit prin atribuirea valorii NULL - nu a fost asignata inca o valoare acestei variabile - variabila a fost stearsa prin functia unset();
Putem afla tipul unei variabile folosind functia gettype() care returneaza un string (sir) continand tipul variabilei cercetate. Observati si studiati exemplul de mai jos <?php $var1 = TRUE; $var2 = 100; $var3 = 23.88; $var4 = "Nume"; $var[5] = "fructe"; echo gettype($var1); echo '<br />'.gettype($var2); echo '<br />'.gettype($var3); echo '<br />'.gettype($var4); echo '<br />'.gettype($var[5]); echo '<br />'.gettype($var6); ?> 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 sfrsitul 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. Cnd doua valori sunt egale, acestea ramn 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. Cnd combinati valorile literale si variabilele cu operatori si functii, construiti ceea ce este cunoscut sub numele de expresii. Operatorii sunt simboluri specifice care realizeaza o actiune specifica in cadrul unei expresii. Operatorii actioneaza asupra variabilelor prezente in expresie. De exemplu in cadrul expresiilor matematice vom folosi operatori aritmetici. $a + $b $a - $b $a * $b $a / $b $a%$a $a +=$b $a -=$b $a *=$b $a /=$b $a++ $a-Adunare : a+b Scadere : a-b Inmultire: a*b Impartire: a/b Moule :restul impartirii lui a la b Echivalent cu: $a = $a + $b Echivalent cu: $a = $a - $b Echivalent cu: $a = $a * $b Echivalent cu: $a = $a / $b Incrementare ; Ecivalent cu $a = $a +1 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 ctul mpartirii. De exemplu, prin mpartirea lui 10 la 3 se obtine ctul 3 si restul 1. Deci, instructiunea de atribuire $x = 10%3; atribuie variabilei $x valoarea 1. Operatorii de incrementare $a++ si decrementare $a-- au un efect diferit daca sunt scrisi ++$a respectiv --$a In primul caz, daca avem de exemplu $x= $a++; i-se atribue lui $x valoarea variabilei $a dupa care se efectueaza operatia de incrementare ($a = $a + 1) Dar daca avem $x = ++$a= se efectueaza operatia de incrementare ($a = $a + 1) dupa care i-se atribue lui $x noua valoarea a lui $a Ca n matematica, PHP evalueaza operatorii de nmultire si de mpartire anterior operatorilor de adunare, respectiv scadere. Aceasta caracteristica se numeste precedenta.
Datorita precedentei, instructiunea $x=1+2*3; atribuie variabilei $x valoarea 7, chiar daca operatorul de adunare apare naintea celui de nmultire. Se respecta regulile din matematica. Daca doriti sa controlati precedenta unei expresii, puteti folosi paranteze. De exemplu, instructiunea $x=(1+2)*3; atribuie variabilei $x valoarea 9, deoarece partea inclusa ntre paranteze a expresiei este evaluata prima, asa cum se procedeaza n algebra. In afara de acesti operatori numerici, PHP include un operator de concatenare a sirurilor (.), denumit uneori operator de unire, deoarece functia sa consta n unirea sirurilor. Sa observam urmatorul exemplu: <?php $var1 = 'Ionescu'; echo 'Numele candidatului este '.$var1; $var2 = 'Candidat: '; $var2 .= $var1; echo "<br />$var2"; ?> Rezutatul afisat va fi: Numele candidatului este Ionescu Candidat: Ionescu In exemplul de mai sus se observa folosirea operatorului de concatenare . (punct) Acest operator adauga la sfarsitul sirului curent noul sir furnizat ca parametru. Expresia $a .= 'Sir de test' este echivalenta cu : $a = $a . 'Sir de test'.
3. Functii
n afara de operatori, PHP include functii care executa operatii utile. Iata unele exemple de functii:
abs(x) - Returneaza valoarea absoluta a lui 'x' ceil(x) - Returneaza valoarea 'x', rotunjita la ntregul imediat superior floor(x) - Returneaza valoarea 'x', rotunjita la ntregul imediat inferior max(x,y,...) - Returneaza valoarea maxima a unui set de valori min(x,y,...) - Returneaza valoarea minima a unui set de valori pow(x,n) - Returneaza numarul 'x', ridicat la puterea specificata 'n' strftime(f) - Returneaza data curenta, formatata conform continutului parametrului 'f' sqrt(x) - Returneaza radacina patrata a lui 'x'
n afara de acestea, PHP include multe alte functii. Consultati site-ul www.php.net Majoritatea functiilor necesita una sau mai multe valori de intrare, cunoscute sub numele de argumente. De exemplu, functia "sqrt" necesita un argument (aici este 'x') care specifica valoarea a carei radacina patrata trebuie calculata. Unele functii, precum min si max, preiau un numar nedefinit de argumente. Alte functii nu necesita nici un fel de argumente. Pentru a putea folosi o functie n mod corespunzator, trebuie sa cunoasteti: Numele functiei Actiunea functiei si valoarea returnata de aceasta, daca exista
Iata un exemplu simplu care foloseste o functie pentru calculul lungimii laturilor unui patrat, daca este cunoscuta aria patratului: $latura=sqrt($arie); Retineti modul n care argumentul functiei este inclus ntre paranteze, precum si modul n care functia si argumentul sau sunt folosite ntr-un mod asemanator cu o valoare literala sau o variabila. Iata un exemplu care prezinta modul de utilizare a functiei "max", care preia mai multe argumente: $punctaj_maxim=max($punctaj1, $punctaj2, $punctaj3); Rezultatul dat variabilei "$punctaj maxim" va fi determinat de functia "max", aceasta determinand valoarea cea mai mare a argumentelor din paranteza. Observati ca fiecare argument este separat de vecinul sau printr-o virgula.
Nume:
Trmite formular
Bottom of Form
Fiecare element al formularului trebuie introdus intre etichetele <form> si </form>. Atributul "action" indica fisierul cu scriptul care va primi datele de la formular si reprezinta una dintre cele mai importante precizari. Fiecare element, camp dintr-un formular trebuie sa aibe un nume distinct, dat prin atributul
"name"; acest nume este folosit de scriptul PHP la care sunt trimise datele, astfel, scriptul PHP recunoaste datele din campul respectiv folosind numele acestuia.
$_POST['nume'] - daca este folosit method="post" $_GET['nume'] - daca este folosit method="get"
- unde "nume este valoarea atributului name al elementului din formularul HTML. Sa luam un exemplu practic de formular HTML care trimite date (prin method="post") la un script PHP unde acestea vor putea fi vizualizate. Salvam scriptul de mai jos intr-un fisier pe care-l numim "test-form.php" <?php $nume = $_POST['nume']; $email = $_POST['email']; $parola = $_POST['parola']; echo "Nume = $nume"; echo "<br />E-mail = $email"; echo "<br />Parola = $parola"; ?> Scriem urmatorul cod HTML intr-un alt fisier "form.html", pe care-l salvam in acelasi director cu scriptul PHP de mai sus. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ro" lang="ro"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title> Test-Form </title> <head> <body>
<form action="test-form.php" method="POST"> Nume:<input type="text" name="nume" /> <br />Email:<input type="text" name="email" /> <br />Parola:<input type="password" name="parola" /> <br /><input type="submit" name="submit" value="Trmite datele" /> </form> </body> </html> In browser va aparea:
Top of Form
Completam datele din formular, de exemplu: la Nume : Popescu, la Email : [email protected] si Parola : parola_mea Dupa ce am competat datele, apasam clic pe butonul "Trimite datele", acestea vor fi trimise la scriptul PHP "test-form.php", care le va prelucra si va afisa urmatorul rezultat: Nume = Popescu E-mail = [email protected] Parola = parola_mea Sa intelegem exemplu de mai sus. Folosind formularul de mai sus, atributul NAME din fiecare eticheta INPUT atribuie fiecarei casete cu text un nume, astfel scriptul PHP va putea recunoaste datele scrise in casete. In scriptul "test-form".php" vom accesa variabilele:
$nume va primi informatia introdusa in campul Nume $email va primi informatia introdusa in campul Email $parola va primi informatia introdusa in campul Parola
Deoarece cunoastem metoda prin care trimitem datele catre scriptul PHP, "POST", am folosit variabila PHP globala _POST pentru a prelua datele din formular: $_POST['nume'] $_POST['email'] $_POST['parola']
Constructia echo trimite datele de iesire care vor fi afisate de browser Variabile PHP globale: _GET si _POST reprezinta de fapt variabile de tip array, fiecare element se poate accesa prin cheia a sa; in cazul nostru cheia fiecarui element este data de atributul : NAME al casetelor din formular
In afara de a expedia unui script datele printr-un formular, puteti expedia date cu ajutorul adresei URL a paginii. Pentru aceasta, atasati la sfarsitul adresei URL un semn al ntrebarii (?) si apoi includeti o serie de perechi "nume-valoare" (separate prin &), ca in exemplu urmator:
http://www.marplo.net/fisier.php?nume1=valoare1&nume2=valoare2
Exemplul include numai doua perechi "nume-valoare"; cu toate acestea, puteti include oricte asemenea perechi doriti (separate prin caracterul &), in functie de limita impusa de browser. Pentru a prelua si folosi datele dintr-o astfel de adresa URL, folositi in interiorul scriptului PHP expresia "$_GET['nume'], ca in exemplu urmator" $var1 = $_GET['nume1'] $var2 = $_GET['nume2']
Unde "nume1" si "nume2" sunt numele variabilelor din adresa URL, iar "$var1" si "$var2" sunt variabilele care vor fi folosite in scriptul PHP (din "fisier.php") si a caror valori vor fi "valoare1" respectiv "valoare2" continute in adresa URL. Daca doriti sa trimiteti unui script, prin intermediul adresei sale URL, caractere speciale precum un semn al intrebarii, un semn egal sau un ampersand, se poate crea confuzie. Pentru a functiona corect, un sir trebuie sa fie codificat URL. Pentru a codifica URL un sir, caracterele speciale se nlocuiesc cu echivalentele lor hexazecimale, precedate de un simbol procent (%). Pentru alte detalii, consultati lectia despre Utilizarea caracterelor speciale, subtitlul 4 ( Conversia adreselor URL). De exemplu, forma codificata URL a sirului "la multi ani!" este %22la multi ani%21%22. Adresa URL rezultanta se numeste "sir de interogare" si nu poate contine spatii. Daca doriti sa trimiteti un spatiu ca parte a unui sir de interogare, trimiteti n locul spatiului un semn plus (+). Iata un exemplu de sir de interogare care codifica numele autorului acestui site:
http://www.marplo.net/script.php?autor=Mar+Plo
Unele dintre cele mai comune caractere speciale si echivalentele lor codificate URL sunt prezentate n tabelul de mai jos: Caracter special Echivalentul codificat URL . *%2e > %3e ^ %5e ~ %7e + %2b , %2c / %2f : %3a ; %3b %3c = %3d > %3e [ %5b \ %5c ] %5d _ %5f { %7b | %7c } %7dc tab %09 spatiu %20
! # $ % & ` ( ) @ `
%21 %22 %23 %24 %25 %26 %27 %28 %29 %40 %60
De exemplu, pt. afisarea domeniului serverului unde ruleaza scriptul echo $_SERVER['SERVER_NAME'];
Descriere - Lungimea, n octeti, a corpului cererii. - Tipul MIME al datelor din corpul cererii. - Calea care constituie radacina arborelui catalogului cu DOCUMENT_ROOT documente al serverului Web. - Returneaza ersiunea protocolului CGI (Common GATEWAZ_INTERFACE Gateway Interface) folosit de serverul Web. HTTP_ACCEPT - Continutul antetului HTTP Accept. - Continutul antetului HTTP Accept-Charset:, care HTTP_ACCEPT_CHARSET specifica seturile de caractere ntelese de client. - Continutul antetului HTTP Accept-Encoding:, care HTTP_ACCEPT_ENCODING specifica tipurile de continuturi ntelese de client. HTTP_ACCEPT_LANGUAGE - Continutul antetului HTTP Accept-Language:, care
HTTP_CONNECTION HTTP_HOST HTTP_REFERER HTTP_USER_AGENT PATH QUERY_STRING REMOTE_ADDR REMOTE_HOST REMOTE_PORT REQUEST_METHOD REQUEST_URI SCRIPT_FILENAME SCRIPT_NAME SERVER_ADMIN SERVER_HOST SERVER_PORT SERVER_PROTOCOL SERVER_SIGNATURE SERVER_SOFTWARE
specifica limbajele preferate de client. - Continutul antetului HTTP Connection:, care indica optiunile solicitate de client. - Continutul antetului HTTP Host:, care indica numele de gazda, folosit de client la prezentarea cererii. - Adresa URL a paginii Web care a trimis clientul la pagina curenta. - Continutul antetului HTTP user-Agent, care indica tipul si versiunea browser-ului folosit. - Calea de executie asociata cu mediul serverului. - Sirul de interogare, daca exista, prin care a fost accesata pagina. - Adresa IP a clientului (vizitatorului). - Numele de gazda al clientului. - Adresa portului clientului de unde a pornit cererea. - Metoda de cerere HTTP folosita; de exemplu, GET, POST, PUT sau HEAD. - URI folosit pentru accesul la pagina curenta. URI este alcatuit dintr-un URL si un sir optional de interogare. - Numele de cale absolut al scriptului curent. - Adresa URL a scriptului curent. - Adresa de e-mail a administratorului serverului Web. - Numele de gazda asociat serverului Web care prelucreaza cererea. - Portul folosit de serverul Web pentru comunicatii. - Numele si versiunea protocolului prin intermediul caruia s-a executat cererea. - Sirul care identifica versiunea serverului Web si numele de gazda folosit pentru prelucrarea cererii. - Sirul care identifica programul server Web si versiunea acestuia.
- O lista completa a acestor variabile de mediu o gasiti la pagina oficiala $_SERVER Puteti obtine accesul la variabila de mediu folosind variabila $_SERVER care este de fapt un Array in care cheile elementelor sunt numele variabilelor de mediu De exemplu, urmatoarea instructiune echo trimite browserului adresa IP a clientului (vizitatorului): <?php $ip = $_SERVER['REMOTE_ADDR']; echo "Adresa dv. IP este $ip"; ?> Afisarea sau nu a acestor variabile globale depinde de permisiunile facute la configurarea serverului PHP si de datele transmise.
O caseta de dialog, prin care sunteti ntrebat daca doriti sa descarcati fisierul care contine scriptul Un mesaj n care se spune ca scriptul nu exista Un mesaj n care se spune ca browserul dumneavoastra Web nu are permisiunea de a obtine accesul la script Un mesaj n care se spune ca scriptul dumneavoastra contine o eroare
La vizualizarea rezultatelor unui script PHP se pot produce numeroase erori, chiar daca scriptul n sine este corect. - Daca vedeti textul scriptului dumneavoastra sau o caseta de dialog prin care sunteti ntrebat daca doriti sa descarcati fisierul care contine scriptul, este posibil ca extensia fisierului script sa fie incorecta sau ca serverul PHP sa nu functioneze. Desi fisierele script PHP trebuie sa aiba, n general, extensia .php, este posibil (dar mai rar) ca un administrator de sistem sa configureze un server PHP astfel nct acesta sa impuna o alta extensie de fisier. Astfel, daca scriptul dumneavoastra esueaza din unul dintre aceste doua motive, luati legatura cu administratorul dumneavoastra de sistem. - Daca vedeti un mesaj n care se spune ca scriptul nu exista, este posibil ca dumneavoastra sa fi tastat incorect adresa URL. Verificati daca ati tastat corect adresa URL identificata de administratorul dumneavoastra de sistem, precum si daca ati atasat corect la aceasta numele fisierului care contine scriptul, folosind un slash numai daca adresa URL identificata de administratorul dumneavoastra de sistem nu se ncheie cu acest caracter. - Daca vedeti un mesaj n care se arata ca browserul dumneavoastra Web nu are permisiunea de a obtine accesul la script, poate ca este necesar sa modificati permisiunile fisierului script. Pentru a afla cum trebuie procedat, consultati-va cu administratorul de sistem. - Daca vedeti un mesaj n care se spune ca scriptul dumneavoastra contine o eroare, verificati daca nu a aparut vreuna din urmatoarele probleme: O eroare de tastare, cum ar fi scrierea gresita a cuvntului echo O eroare de punctuatie, cum ar fi paranteze, ghilimele sau punct si virgula, lipsa sau inserate gresit Neincluderea sau includerea eronata a liniilor de delimitare a scriptului, n speta <?php si ?> Un marcaj de comentariu ( / / ) care lipseste sau care a fost introdus gresit
De exemplu, iata un script care contine un tip de eroare frecvent ntlnit. Puteti identifica eroarea? <?php // Acest script contine o eroare de sintaxa echo "Salut, World Wide Web!; ?> Din script lipseste caracterul ghilimele duble de nchidere, care trebuie sa delimiteze expresia de tip text. Daca ncercati sa executati acest script, puteti vedea doar o pagina goala sau o eroare similara celei prezentate n continuare. Parse error. Parse error in /home/bmccarty/public_html/php/module-01/syntax-error.php On line 7 Mesajul de eroare ncearca sa va indice sursa erorii, indicnd numarul liniei la care s-a produs eroarea. Totusi, remarcati ca mesajul va ndruma spre linia 7 a unui script care contine numai 4 linii. Din moment ce ghilimelele duble de nchidere lipsesc, serverul PHP cauta dincolo de sfrsitul scriptului pentru a gasi ghilimelele duble respective. Ca atare, serverul PHP este oarecum derutat cu privire la sursa erorii. Morala este aceea ca nu puteti conta n totalitate pe serverul PHP pentru a determina locatia
erorii; folositi numarul de linie furnizat de server numai ca ndrumar pentru a depista locatia probabila a erorii.
3. Tratarea erorilor
Modulul PHP poate fi configurat astfel incat sa afiseze erorile intilnite in codul PHP. Acest lucru poate fi foarte util in cazul depanarii programelor. Pentru a activa afisarea erorilor exista doua metode: - 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); echo "Valoarea transmisa este ".$_GET['orase']; ?> - Testati acest exemplu pentru a vedea rezultatul.
n aceasta lectie vom discuta despre constante si variabile dinamice. Puteti scrie programe PHP utile si complexe fara a utiliza constante sau variabile dinamice. Daca utilizarea constantelor poate facilita citirea programelor dumneavoastra, variabilele dinamice au un
efect contrar. Din acest motiv, n general se recomanda evitarea variabilelor dinamice, mai ales de catre programatorii PHP ncepatori. Totusi, va puteri afla n situatia de a lucra la un program PHP scris de o persoana care foloseste aceste variabile; prin urmare, trebuie sa aveti cunostinte despre variabilele dinamice, indiferent daca le folositi sau nu n propriile dumneavoastra programe.
1. Utilizarea constantelor
O constanta este pur si simplu o valoare care este... constanta, cu alte cuvinte o valoare care nu se modifica, n acest sens, constantele sunt opusele variabilelor, deoarece valoarea unei variabile se poate modifica pe durata executiei unui program. Pentru a defini o constanta, folositi functia define(). Sa consideram urmatorul exemplu: define("PI", 3.14159); - Aceasta instructiune defineste constanta "PI", atribuindu-i valoarea 3.14159. Dupa ce a fost definita, o constanta se poate folosi n cadrul unei expresii. De exemplu, puteti calcula aria unui cerc dupa cum urmeaza: $arie = PI * $raza * $raza; - Observati ca referintele la o constanta nu folosesc simbolul dolarului. Astfel, o constanta poate fi cu usurinta deosebita de o variabila. Multi programatori scriu numele constantelor folosind numai majuscule, ceea ce le face si mai simplu de identificat. O functie conexa, defined(), poate determina daca o anumita constanta a fost definita. De exemplu, cu ajutorul urmatoarei instructiuni PHP puteri determina daca fost definita constanta Pi: echo defined("PI"); - Retineti ca numele care va fi testat este delimitat prin ghilimele duble. Functia defined() returneaza valoarea 1 (unu) daca respectiva constanta a fost specificata; n caz contrar, returneaza zero In acest exemplu, instructiunea echo va afisa valoarea 1. Pe lnga sporirea lizibilitatii programelor, constantele pot facilita modificarea acestora. Sa presupunem ca ati scris un program care contine multe calcule ce folosesc valoarea 3,14159, iar ulterior ati descoperit ca trebuia sa folositi valoarea mai exacta 3,1415926535898. Descoperirea si modificarea fiecarei aparitii a valorii originale poate fi o activitate mare consumatoare de timp. Dar, daca ati definit o constanta pentru reprezentarea valorii, numarul 3,14159 va aparea o singura data n program si va fi necesara doar o singura modificare a constantei. Valoarea "pi" este folosita extrem de frecvent n unele calcule. Pentru comoditate, PHP furnizeaza o functionalitate mai indicata dect definirea unei constante cu valoarea pi, functia pi() returneaza valoarea respectiva, cu 14 cifre semnificative (3.1415926535898). Astfe, puteti calcula aria unui cerc folosind urmatoarea expresie: $arie= pi() * $raza * $raza;
echo $$film; ?> O variabila dinamica este denumita folosind doua simboluri ale dolarului ($$) si este asociata cu o variabila obisnuita care are un nume similar si include un singur simbol al dolarului. In exemplul de mai sus, variabila dinamica $$film este asociata cu variabila obisnuita, dar cu aceasi nume, $film. Valoarea unei variabile obisnuite da numele (fara un simbol al dolarului) unei a doua variabile ordinare, n exemplu nostru, a doua variabila obisnuita este $oameni_buni. Valoarea acestei a doua variabile obisnuite este valoarea variabilei dinamice: n exemplu, aceasta este valoarea 12. Deci valoarea variabiei dinamice $$film, si care va fi afisata de functia "echo" este 12. O variabila dinamica nu contine, practic, propria sa valoare. n schimb, contine amplasamentul unde se poate gasi valoarea; cu alte cuvinte, numele unei alte variabile. Daca variabilele dinamice vi se par derutante, asa e, variabilele dinamice sunt derutante. Sunt rar folosite, uneori este posibila reducerea dimensiunilor unui program folosind una sau mai multe variabile dinamice.
- Instructiunea de atribuire care stocheaza o valoare n variabila $z este interesanta, deoarece expresia din membrul drept include un operand Integer (ntreg) si un operand de tip float. Ce valoare va aparea la iesire? Raspunsul corect este 3.5, o valoare de tip float. Cnd o expresie aritmetica foloseste mai multe tipuri de variabile, PHP executa conversia automata a tipului. Daca unul dintre operanzi este de tip float, PHP trateaza ceilalti operanzi ca si cum ar fi de tip float, executa calculele si returneaza rezultatul ca valoare de tip float. Este important sa ntelegeti faptul ca prin conversia de tip nu se modifica tipurile variabilelor unei expresii; acestia sunt pur si simplu tratati ca si cum ar fi fost de un alt tip. In cadrul exemplului, variabila $x ramne de tip nteger, chiar daca PHP o trateaza ca o valoare de tip float pentru a executa calculele. Sirurile (variabilele de tip string) pot fi de asemenea supuse unei conversii de tip. Sa examinam urmatorul exemplu: $x = 1; $y = $x+ "inca 1"; echo $y
- Aici cuvntul "inca" din sirul text este ignorat. Valoarea afisata este 2, adica suma dintre valoarea variabilei $x si valoarea numerica a sirului text, care este 1. Valoarea numerica si tipurile unui sir sunt determinate prin respectarea urmatoarelor reguli:
1. Daca sirul ncepe cu o valoare numerica, valoarea sirului este data de valoarea numerica respectiva; n caz contrar, valoarea sirului este zero. 2. Daca un punct zecimal sau un exponent (e sau E), este asociat cu valoarea numerica, tipul variabilei rezultante este float; n caz contrar, tipul valorii rezultante este un ntreg.
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
- Trateaza argumentul ca fiind de tip dublu. - Trateaza argumentul ca fiind de tip ntreg. - Trateaza argumentul ca fiind de tip string
Nici conversia normala si nici cea fortata nu modifica tipul unei variabile. Ambele mecanisme determina tratarea variabilelor doar in expresia respectiva ca si cum ar fi de un alt tip. Totusi, modificarea tipului unei variabile este posibila prin utilizarea functiei settype(). Acest procedeu este ilustrat n urmatorul exemplu: $x = 1.5; settype($x,"integer"); echo $x; // Va afisa valoarea 1
- Tipul variabilei $x va fi schimbat in "integer", astfel valoarea afisata a variabilei $x este 1, deoarece fractia zecimala se pierde atunci cnd functia settype() converteste valoarea float la o valoare ntreaga. Valorile posibile pentru al doilea argument al functiei settype(), si anume argumentul care specifica tipul dorit, sunt: "integer" "double" "string" "array" "object"
Sa ne amintim din lectia 2 ca exista o functie conexa, gettype(), care returneaza un sir care indica tipul variabilei specificate. Scriptul urmator afiseaza "integer", care indica tipul variabilei $x: $x = 1; echo gettype($x); - O lista cu mai multe functii utile in lucru cu tipuri de variabile si valorile lor gasiti la pagina -> Functii pentru tipuri de variabile si valori.
} ?> 2. floatval($var) - Returneaza valoarea float (numar cu zecimale) a lui "$var", care poate fi numar, ecuatie sau sir. Similara este si functia "doubleval()". <?php $var = '123.456'; echo floatval($var); ?> 3. get_defined_vars() - Returneaza un array multidimensional ce contine o lista cu toate variabilele definite. <?php $arr = get_defined_vars(); print_r($arr["_POST"]); // Returneaza toate variabilele $_POST ?> 4. get_resource_type(resursa) - Returneaza un sir cu tipul resursei din parametru. <?php $c = mysql_connect(); echo get_resource_type($c);
// 123.456
// mysql link
$fp = fopen("marplo.net", "w"); echo get_resource_type($fp); // file ?> 5. gettype($var) - Returneaza tipul variabilei "$var". Un sir cu unul din urmatoarele tipuri: boolean, integer, double, string, array, object, resource, NULL, unknown type. <?php $var1 = 8; echo gettype($var1); $var2 = "8"; echo gettype($var2);
// integer // string
$var3 = array(8=>'http://www.marplo.net'); echo gettype($var3); // array $var4 = true; echo gettype($var4); ?> 6. intval($var) - Transforma valoarea variabile "$var" in numar natural. // boolean
<?php $var1 = 8.9; echo intval($var1); $var2 = "08"; echo intval($var2); $var3 = -7.8; echo intval($var3); ?> 7. is_array($var)
// 8 // 8 // -7
- Returneaza TRUE daca "$var" e o matrice (Array), in caz contrar, FALSE. <?php $lectii = array('http://www.marplo.net', 'php', 'html', 'css'); if (is_array($lectii)) { echo '$lectii e o matrice'; } ?> 8. is_bool($var) - Returneaza TRUE daca "$var" e de tip "boolean", in caz contrar, FALSE. <?php $var = true; if (is_bool($var)) { echo '$var e de tip boolean'; } ?> 9. is_float($var) - Returneaza TRUE daca "$var" e un numar cu virgula (cu zecimale), in caz contrar, FALSE. Acelasi rezultat il dau si functiile "is_double()" si "is_real()". <?php $nr = 78.9; if (is_float($nr)) { echo '$nr e un numar cu zecimale'; } ?> 10. is_int($var) - Returneaza TRUE daca "$var" e un numar natural (fara zecimale), in caz contrar, FALSE. Acelasi rezultat il dau si functiile "is_integer()" si "is_long()". <?php $nr = 78; if (is_int($nr)) { echo '$nr e un numar natural'; } ?>
11. is_null($var) - Returneaza TRUE daca "$var" are valoarea nula, in caz contrar, FALSE. <?php $var = null; if (is_null($var)) { echo '$var are valoarea NULL'; } ?> 12. is_numeric($var) - Returneaza TRUE daca "$var" e un numar (cu sau fara zecimale), in caz contrar, FALSE. <?php $nr = 078.9; if (is_numeric($nr)) { echo '$nr e un numar'; } ?> 13. is_object($var) - Returneaza TRUE daca "$var" e o variabila de tip obiect, in caz contrar, FALSE. <?php // Se creaza o functie de lucru function get_vars($obj) { // Daca variabila $obj e un obiect, returneaza tipul de valori din ea if (is_object($obj)) { return var_dump($obj->get_vars); } else { return '$obj nu e de tip obiect'; } } // Defineste o clasa si-i adaga un eveniment cu apel la functie $obj = new stdClass(); $obj->get_vars = array('cursuri', 'tutoriale', 'jocuri') // Afiseaza rezultatul apelarii functiei cu $obj echo get_vars($obj); // array(3) { [0]=> string(7) "cursuri" [1]=> string(9) "tutoriale" [2]=> string(6) "jocuri" } ?> 14. is_string($var) - Returneaza TRUE daca "$var" e un sir, in caz contrar, FALSE. <?php $var = 'sir test'; if (is_string($var)) { echo '$var e un sir';
} ?> 15. isset($var) - Returneaza TRUE daca "$var" e setata (exista in domeniul de lucru, indiferent de valoarea ei), in caz contrar, FALSE. <?php $v = ''; if (isset($v)) { echo 'Variabila exista'; } ?> 16. print_r(array) - Afiseaza un sir care prezinta cheile si elementele dintr-o matrice (array). Daca parametru "array" e un sir sau numar, va afisa valoarea lui. <?php $aray = array('site'=>'www.marplo.net', 'php'=>'tutoriale'); print_r($aray); // Array ( [site] => www.marplo.net [php] => tutoriale ) $var = 'Un sir oarecare'; print_r($var); // Un sir oarecare ?> 17. serialize($var) - Stocheaza valoarea /valorile variabilei "$var" intr-un sir. Variabila din parametru poate fi si de tip Array sau Object. Aceasta functie este utila mai ales pentru stocarea ori transmiterea datelor unei matrice sau obiect, mentinandu-le structura. - In cazul obiectelor, se face "serialize" la instanta obiectului (vezi exemplul urmator, de la "unserialize()"), si sunt salvate in sir variabilele si valorile lor dar nu si metodele (functiile), ci doar numele lor. <?php $aray = array('site'=>'www.marplo.net', 'php'=>'tutoriale'); // Transforma si adauga elementele /valorile variabilei $aray intr-un sir specific $sir_var = serialize($aray); echo $sir_var; // a:2:{s:4:"site";s:14:"www.marplo.net";s:3:"php";s:9:"tutoriale";} // Creaza o variabila cu sirul serialized identic de mai sus $sir_serialized = 'a:2:{s:4:"site";s:14:"www.marplo.net";s:3:"php";s:9:"tutoriale";}'; // Transforma acest sir in tipul initial de variabila $get_var = unserialize($sir_serialized); print_r($get_var); // Array ( [site] => www.marplo.net [php] => tutoriale ) ?> 18. unserialize(sir) - Creaza (Retransforma) la forma initiala structura unei variabile care a fost transformata in sir cu "serialize()". Vezi si exemplul de mai sus.
<?php // Se creaza o clasa simpla class test { public $nr = 8; // O metoda (functie) a clasei (afiseaza valoarea lui $nr) public function show_nr() { echo $this->nr; } } // Creaza instanta la aceasta clasa $use_class = new test; // Stocheaza clasa (instanta ei), cu serialize, intr-un sir $sir_class = serialize($use_class); echo $sir_class; // O:4:"test":1:{s:2:"nr";i:8;} // Recreaza instanta la clasa stocata cu serialize in $sir_class $get_class = unserialize($sir_class); // Apeleaza metoda clasei, cu instanta stocata acum in $get_class $get_class->show_nr(); // 8 ?> 19. settype($var, 'tip') - Seteaza tipul variabile "$var" in "tip", acesta poate fi unul din urmatoarele siruri: "boolean", "integer", "double", "string", "array", "object", "NULL". Returneaza TRUE in caz de succes, altfel, FALSE. <?php $var = 7.8; echo gettype($var);
// double
// Modifica tipul variabilei, in "string" settype($var, 'string'); echo gettype($var); // string ?> 20. strval($var) - Preia intr-un sir valoarea variabilei "$var". <?php $var = 7*8; echo strval($var); ?> 21. unset($var) - Distruge variabila "$var". <?php $aray = array('key'=>'test', 'php'=>'functii'); print_r($aray); // Array ( [key] => test [php] => functii )
// 56 (sir)
// Distruge un element din matrice unset($aray['key']); print_r($aray); // Array ( [php] => functii ) ?> 22. var_dump($var) - Afiseaza informatii detaliate despre variabila din parametru, cum ar fi: tipul ei, numarul de elemente si valoarea (valorile) din ea. <?php $aray = array('key'=>'test', 'php'=>'functii'); var_dump($aray); // array(2) { ["key"]=> string(4) "test" ["php"]=> string(7) "functii" } $sir = 'Sir test'; var_dump($sir); ?> // string(8) "Sir test"
23. var_export($var, true) - Parametrul "true" e optional, cand acesta este adaugat, functia returneaza un sir cu structura variabilei "$var", care poate fi exportat sub forma de sir in alta variabila. Daca parametrul "true" nu e adaugat, afiseaza direct structura completa a lui "$var". E similara cu "var_dump()", diferenta fiind ca "var_export()" returneaza structura variabilei asa cum e scrisa, valida cod PHP. <?php $aray = array('key'=>'test', 'php'=>'functii'); $get_var = var_export($aray, true); // Exporta structura lui $aray, ca sir, in alta variabila echo $get_var; // array ( 'key' => 'test', 'php' => 'functii', ) $sir = 'Sir test'; var_export($sir); ?> // 'Sir test'
nvatati sa definiti si sa folositi valorile de tip adevarat/fals nvatati sa ntelegeti si sa scrieti instructiunile if si else
$a<1;
Aceasta expresie conditionala foloseste operatorul <, care are, n esenta, aceeasi semnificatie ca n algebra. Expresia are valoarea TRUE daca si numai daca valoarea variabilei $a este mai mica dect 1; n toate celelalte cazuri, are valoarea FALSE. Puteti forma expresii conditionale complexe prin unirea a doua expresii conditionale cu ajutorul unui operator logic. De exemplu, expresia urmatoare este adevarata daca ambele expresii conditionale care o compun sunt adevarate: $a < 1 AND $b < 1 Cu alte cuvinte, expresia este adevarata daca att variabila $a, ct si variabila $b au valori mai mici dect 1. PHP furnizeaza un set de asemenea operatori relationali, prezentati pe scurt n tabelul de mai jos. Puteti folosi operatorii logici pentru compararea sirurilor; cu toate acestea, un sir care apare ntr-o expresie conditionala este convertit la o valoare numerica nainte de evaluarea expresiei. Deseori, se ajunge la rezultate neasteptate, n general, valorile sirurilor trebuie sa fie comparate folosind o functie de comparare a sirurilor; aceste functii vor fi explicate n lectiile urmatoare. Operatori logici Descriere - TRUE daca valoarea lui $a este mai mica dect valoarea lui $b. - TRUE daca valoarea lui $a este mai mare dect valoarea lui $b. - TRUE daca valoarea lui $a este mai mare sau egala cu valoarea lui $b - TRUE daca valoarea lui $a este mai mica sau egala cu valoarea lui $b - TRUE daca valoarea lui $a este egala cu valoarea lui $b. - TRUE daca $a si $b sunt identice; cu alte cuvinte, daca $a si $b au $a == $b acelasi tip si aceeasi valoare $a != $b - TRUE daca valoarea lui $a este diferita de valoarea lui $b - TRUE daca $a si $b nu sunt identice; cu alte cuvinte, daca $a si $b nu $a !== $b sunt de acelasi tip si aceeasi valoare $x AND $y - TRUE daca att $x, ct si $y sunt adevarate $x && $y - TRUE daca att $x, ct si $y sunt adevarate. $x OR $y - TRUE daca minimum una din expresiile $x sau $y este adevarata. $x || $y - TRUE daca minimum una din expresiile $x sau $y este adevarata. $x XOR $y - TRUE daca numai una din expresiile $x sau $y este adevarata. !$x - TRUE daca $x este FALSE NOT $x - TRUE daca $x este FALSE Operator $a < $b $a > $b $a >= $b $a <= $b $a = $b Retineti ca puteti prefixa o expresie conditionala cu operatorul !, care inverseaza valoarea "TRUE" sau "FALSE" a operandului sau. Observati ca PHP foloseste doi operatori logici care executa aceeasi operatie (AND si &&) respectiv (OR si ||). Cu toate acestea, operatorii difera din punctul de vedere al precedentei - caracteristica care determina ordinea n care sunt executate operatiile n timpul evaluarii expresiilor. Operatorii && si || au o precedenta relativ ridicata, n timp ce operatorii AND si OR au o precedenta relativ redusa. Este la fel ca in aritmetica unde, intr-o ecuatie ca aceasta: a + b * c se executa intai inmultirea si apoi adunarea, chiar daca ordinea lor este alta (daca nu sunt folosite paranteze). La fel si in PHP, se pot folosi paranteze rotunde pentru a controla ordinea executarii operatiilor. Pentru comoditate, puteti forma expresii conditionale fara un operator logic. De exemplu, daca $a este o variabila numerica, puteti folosi expresia $a ca expresie conditionala. Expresia
este considerata ca avnd valoarea FALSE daca valoarea variabilei $a este zero, respectiv valoarea TRUE daca valoarea variabilei respective este diferita de zero. Daca folositi un sir ca expresie conditionala, expresia are valoarea FALSE daca sirul este vid sau daca are valoarea speciala "\0", care simbolizeaza un octet cu valoarea zero. Similar, utilizarea unei valori nedefinite ca expresie conditionala determina obtinerea valorii FALSE. Daca folositi un tablou sau un obiect ca expresie conditionala, aceasta are valoarea FALSE daca tabloul sau obiectul sunt vide (fara vreo valoare); n caz contrar, expresia are valoarea TRUE.
- Dupa cum se observa dupa if urmeaza o pereche de paranteze rotunde in interiorul carora se plaseaza conditia, adica o expresie logica a carei rezultat poate fi TRUE sau FALSE. Daca si numai daca rezultatul expresiei logice (conditia) este TRUE se vor executa instuctiunile : Instructiune(1), apoi Instructiune(2), etc... Se observa ca acest set de instructiune se plaseaza intre acolade. Doar intr-un singur caz aceste acolade nu sunt necesare si anume: in cazul in care este scrisa doar o singura instructiune. Daca rezultatul expresiei logice dintre paranteze rotunde este FALSE , setul de instructiuni dintre acolade nu se va executa, controlul programului va trece mai departe. Iata inca un exemplu, practic: <?php $numar = 12; if ($numar > 10) echo "Acesta este un numar mai mare decat 10"; ?> - Atunci cnd este executat scriptul, instructiunea if evalueaza expresia conditionala $numar > 10, care este adevarata (TRUE) numai daca valoarea variabilei $numar este mai mare dect 10. Daca valoarea variabilei $numar este mai mare decat 10, se va executa instructiunea echo, in caz contrar programul va trece mai departe. In general, limbajul PHP ignora spatiile albe. In mod conventional, o instructiune asociata unei instructiuni "if" este scrisa decalat n raport cu aceasta. Acest procedeu este recomandat deoarece prin utilizarea sa este facilitata citirea programului.
Instructiune(3); Instructiune(4); .................. } In acest din urma caz daca expresia logica din paranteze: conditie este adevarata se vor executa instructiunile: Instructiune(1); Instructiune(2); , iar daca valoarea expresiei logice : conditie are valoarea FALSE se vor executa instructiunile: Instructiune(3); Instructiune(4); Instructiunea asociata unei instructiuni if sau else poate fi ea nsasi o instructiune if. O asemenea instructiune if se numeste "instructiune if imbricata". Iata un exemplu de instructiune if imbricata: <?php $numar = 88; if ($numar > 10) if ($numar > 100) echo "Acesta este un numar mai mare decat 100"; else echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10"; else echo "Acesta este un numar mic"; ?> Exemplul afiseaza mesajul "Acesta este un numar mai mare decat 100" daca valoarea variabilei $numar depaseste 100; n caz contrar, daca valoarea variabilei $numar este mai mare dect 10 si mai mica decat 100, se afiseaza mesajul "Acesta este un numar mai mic decat 100, dar mai mare decat 10". Daca valoarea variabilei $numar este mai mica sau egala cu 10, exemplul afiseaza mesajul "Acesta este un numar mic". Instructiunile if imbricate pot deveni extrem de dificil de nteles daca numarul de instructiuni si nivelul de imbricare nu sunt relativ reduse. Deci trebuie sa le folositi cu economie. O instructiune corelata att cu instructiunea if, ct si cu instructiunea else, este instructiunea elseif. Cnd este folosita corect, poate fi mai simplu de nteles dect o instructiune if imbricata, logic echivalenta cu aceasta. Iata un exemplu de instrutiune elseif: <?php $numar = 88; if ($numar > 100 ) echo "Acesta este un numar mai mare decat 100"; elseif ($numar > 10) echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10"; elseif ($numar > 1) echo "Acesta este un numar mic"; else echo "Acesta este un numar foarte mic"; ?> Exemplul extinde functionalitatea exemplului anterior, afisnd mesajul "Acesta este un numar foarte mic" pentru valori ale variabilei $numar mai mici sau egale cu 1. ntr-un caz general, cu o instructiune if si cu o instructiune else poate fi asociat un numar mult mai mare de instructiuni elseif. PHP evalueaza expresiile conditionale n mod succesiv, pornind de la expresia conditionala asociata instructiunii "if". PHP executa instructiunea asociata primei expresii conditionale care are valoarea TRUE; daca nici o expresie conditionala nu are valoarea TRUE, PHP executa instructiunea asociata cu instructiunea else.
Este permisa omiterea instructiunii else, caz n care nu este executata nici o instructiune daca nici una din expresiile conditionale nu are valoarea TRUE.
nvatati sa ntelegeti si sa scrieti instructiunea switch si instructiunile conexe acesteia nvatati sa ntelegeti si sa scrieti instructiunile while, do while si for
Nu este necesar sa folositi numere ntregi consecutive n instructiunile case ale unei instructiuni switch. Daca preferati, puteti folosi numere ntregi non-consecutive, numere cu virgula sau siruri.
2. Operatorul ? :
Operatorul conditional ?:, denumit uneori "operator ternar" sau "operator ntrebare-doua puncte", constituie o alta modalitate de a scrie decizii n PHP. Acest operator formeaza o expresie care se poate folosi n multe contexte PHP. Iata sintaxa de utilizare a acestuia: expresie-conditionala ? valoare-TRUE : valoare-FALSE Observati cum semnul ntrebarii este separat de caracterul doua puncte prin valoarea valoareTRUE. Operatorul conditional si evalueaza expresia conditionala. Daca expresia este evaluata la valoarea TRUE, operatorul conditional returneaza valoarea valoare-TRUE; n caz contrar, returneaza valoarea valoare-FALSE. De exemplu, sa luam n considerare urmatoarea instructiune de atribuire, care foloseste un operator conditional: $a = ($b > $c) ? 10 : 20 Aceasta instructiune de atribuire compara valorile variabilelor $b si $c. Daca valoarea variabilei $b este mai mare dect aceea a variabilei $c (adica TRUE), atunci variabilei $a i este atribuita valoarea 10; n caz contrar, variabilei respective i este atribuita valoarea 20.
expresie1 se executa o singura data si anume la inceputul instructiunii; conditie este o expresie logica ; instructiunea for se executa atita timp cat valoarea expresiei : conditie are valoarea TRUE. De fiecare data dupa executia instructiunilor dintre acolade se executa : expresie2. Iata un exemplu practic de utilizare a unei instructiuni for: <?php $suma = 0; for ($n=1; $n<=3; $n++) { $suma += $n; echo "<br /> Suma intregilor de la 1 la $n este $suma."; } ?> Rezultatul afisat va fi: Suma intregilor de la 1 la 1 este 1 Suma intregilor de la 1 la 2 este 3 Suma intregilor de la 1 la 3 este 6 n exemplu se calculeaza suma ntregilor cuprinsi ntre l si 3. Pentru aceasta, mai nti se initializeaza variabila $suma la valoarea 0. Apoi se executa o instructiune for care
incrementeaza n mod repetat valoarea variabilei $suma. Pentru a vedea cum functioneaza mecanismul acestei instructiuni, sa examinam componentele instructiunilor for. Instructiunea "for" include trei expresii, care apar ntre paranteze; fiecare expresie este separata de vecina sa printr-un caracter punct si virgula(;).
Prima expresie este expresia de initializare. Aceasta se executa atunci cnd PHP ajunge la instructiunea for. In exemplu, expresia de initializare atribuie valoarea variabilei $n, ($n=1) variabila denumita "variabila de ciclare" sau "index". A doua expresie este expresia de test. Aceasta este o expresie conditionala care indica daca se executa sau nu corpul instructiunii, n general, face referire la variabila de ciclare. In cadrul exemplului, expresia de test compara valoarea variabilei $n cu valoarea 3 ($n <= 3). Expresia de test este evaluata pentru prima data imediat dupa evaluarea expresiei de initializare. Cea de-a treia expresie este expresia pas. n general, aceasta modifica una sau mai multe variabile la care se face referire n expresia test. n cadrul exemplului, expresia pas incrementeaza valoarea variabilei $n ($n++).
Dupa care se trece la corpul instructiunii for, aici, instructiunea $suma += $n si echo "Suma intregilor de la 1 la $n este $suma."; reprezinta corpul instructiunii for. Dupa executarea corpului functiei se verifica din nou expresia de test (conditie) dintre paranteze, daca rezultatul este TRUE se trece mai departe la expresia "pas" (a treia din paranteze) si mai departe la corpul functiei for. Dupa aia din nou la expresia de test dintre paranteze..., pana cand rezultatul este FALSE (in exemplu nostru, $n>3) Instructiunea for este utila pentru numarare si executarea n mod repetat a unor actiuni.
Instructiunea while executa un set de instructiuni atita timp cit valoarea expresiei "conditie" este adevarata: Forma generala a instructiuni while este urmatoarea :
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
Iata exemplul prezentat la functia while, de data aceasta folosind functia do while : <?php $n = 0; $suma = 0; do { $suma = $suma +$n; $n++; } while ($n <= 3); echo "Suma este $suma"; ?> Rezultatul va fi acelasi: "Suma exte 6". n general, este bine sa fiti prudent si sa folositi instructiunea while, care evalueaza o conditie de test nainte, de executarea corpului acesteia. Astfel, se evita executarea eronata a corpului buclei.
1. Utilizarea matricelor
Deseori este convenabila stocarea mai multor valori ntr-o variabila. O asemenea variabila se numeste matrice (Array sau "tablou"), iar valorile individuale se numesc elementele matricei. Aici, "matrice", "Array" sau "tablou" reprezinta acelasi lucru (in varianta engleza: Array), fapt pentru care vom folosi orcare dintre aceste denumiri. Fiecare element al unei matrici are doua elemente importante: cheia si valoarea elementului. Matricele pot fi create folosind doua medode principale: 1 - utilizand direct instructiunile de atribuire 2 - folosind sintaxa array() despre care am vorbit in Lectia 2 despre tipul variabilelor.
1. Crearea de matrice folosind functia de atribuire Pentru a crea o matrice, atribuiti unui element al matricei o valoare si o cheie. De exemplu, urmatoarea instructiunea de atribuire: $clasa[1] = "geometrie"; creeaza un tablou denumit "$clasa" si un element cu valoarea "geometrie" identificat prin cheia "1". Pentru a stoca n matrice o a doua valoare, puteti folosi urmatoarea instructiune de atribuire: $clasa[2] = "algebra"; Pentru a obtine acces la un element al matricei, specificati numele matricei si valoarea cheii. De exemplu, instructiunea de atribuire $clasa_mate = $clasa[1]; Atribuie valoarea "geometrie" variabilei $clasa_mate. Cheile folosite pentru identificarea elementelor unei matrice nu trebuie sa fie obligatoriu numere consecutive; nici macar nu trebuie sa fie numere. De exemplu, iata instructiuni de atribuire care creeaza o matrice ce stocheaza preferinte n materie de fructe:
2. Crearea de matrice folosind sintaxa array() Dincolo de utilizarea instructiunilor de atribuire, cealalta modalitate principala de creare a unui tablou PHP consta n utilizarea functiei array(). Iata un exemplu simplu, care creeaza un tablou avnd drept chei valori ntregi consecutive: $limbaje = array("Perl", "PHP", "Python"); Deoarece valoarea cheilor nu a fost specificata, acestea vor fi automat trecute de program ca numere intregi consecutive, incepand de la "0" (prima cheie va avea valoarea '0', a doua cheie va avea valoarea '1', ...) Aceasta instructiune creeaza o matrice care contine urmatoarele asocieri:
0 => Perl 1 => PHP 2 => Python $limbaje = array(10=>"Perl", "PHP", "Python");
Daca doriti sa asociati unei valori o anumita cheie, puteti folosi operatorul =>, astfel:
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"); PHP => Ridicat Python => Mediu Perl => Redus
2. Matrici multi-dimensionale
Este posibil ca un element al matricei sa fie de asemenea o matrice. In acest caz avem de-a face cu o matrice multi-dimensionala. Sa luam un exemplu practic : <?php $multiDimArray[firstLine] = array(1=>10, 2=>20, "a"=>"alpha"); $multiDimArray["nextLine"] = array(1=>20, 2=>40, "b"=>"beta"); echo "<br />".$multiDimArray["firstLine"][1]; echo "<br />".$multiDimArray["nextLine"][1]; echo "<br />".$multiDimArray["firstLine"][2]; echo "<br />".$multiDimArray["firstLine"]["a"]; echo "<br />".$multiDimArray["nextLine"]["b"]; ?> Sau putem scrie acelasi script si astfel (rezultatul e acelasi) : <?php $multiDimArray = array("firstLine"=>array(1=>10, 2=>20, "a"=>"alpha"), "nextLine"=>array(1=>20, 2=>40, "b"=>"beta")); echo "<br />".$multiDimArray["firstLine"][1]; echo "<br />".$multiDimArray["nextLine"][1]; echo "<br />".$multiDimArray["firstLine"][2]; echo "<br />".$multiDimArray["firstLine"]["a"]; echo "<br />".$multiDimArray["nextLine"]["b"]; ?> Rezultatul afisat va fi urmatorul : 10 20 20 alpha beta In exemplul de mai sus am declarat un array cu 2 linii si 3 coloane. Prima linie este identificata de array-ul cu numele "fisrtLine", iar ce-a de-a doua linie este identificata de "nextLine". Observati de asemenea foloasirea in functia "echo" a operatorului de concatenare "." impreuna cu "<br />" (care este un element din XHTML), pentru ca la afisarea in browser
fiecare rezultat al functiei "echo" sa fie trecut pe o linie noua. In caz contrar rezultatele ar fi fost pe aceeasi linie : 10 20 20 alfa beta
4. Parcurgere Array
Uneori, n loc de a obtine accesul la un singur element al unui tablou sau de a-l modifica, doriti sa obtineti accesul la mai multe elemente ale tabloului. De exemplu, sa presupunem ca doriti sa determinati daca n tablou exista o anumita cheie sau valoare. Sau sa presupunem ca tabloul reprezinta preturi si doriti sa micsorati fiecare valoare cu 10 procente. Operatii de acest gen implica parcurgerea iterativa a tabloului sau, altfel spus, accesul la fiecare element al tabloului. - Parcurgerea unui Array secvential Un Array ale carui chei sunt valori ntregi consecutive se numeste "Array secvential". n general, valoarea cea mai mica a unei chei dintr-un tablou secvential este zero; totusi, puteti crea un tablou secvential folosind valoarea 1 sau orice alta valoare ntreaga ca valoare minima a cheii. n cazul n care cunoasteti valoarea minima a cheii unui tablou secvential, puteti parcurge tabloul folosind o bucla for. Pentru aceasta, initializati variabila de bucla la valoarea cea mai redusa a cheii. Folositi functia count() pentru a forma expresia de test (conditia) a buclei. Functia count() returneaza numarul elementelor dintr-un tablou. Iata un exemplu simplu <?php $limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python"); $limita = count($limbaje); for ($i = 0; $i < $limita; $i++) { echo "<br />$i => $limbaje[$i]"; } ?> Prima variabila $imbaje creeaza tabloul. Cea de-a doua variabila $limita foloseste instructiunea count() pentru a obtine numarul elementelor din tablou. Instructiunea for foloseste variabila bucla $i pentru a parcurge iterativ (element cu element) tabloul; corpul instructiunii include o instructiune echo care afiseaza cheia si valoarea fiecarui element din tablou. Datele de iesire vor fi astfel: 0 => Perl 1 => PHP 2 => Python
Sa ne concentram asupra problemei de a determina daca un tablou contine o anumita valoare. Iata un exemplu: <?php $limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python"); $cauta = PHP; // se cauta in tabloul $limbaje valoarea $cauta $limita = count($limbaje); for ($i = 0; $i < $limita; $i++) { echo "<br />Determinarea unei identitati cu $limbaje[$i]"; if ($cauta == $limbaje[$i]) { echo "<br />$cauta este un limbaj excelent."; } } ?> Prima variabila $imbaje creeaza tabloul n care se va cauta. Cea de-a doua instructiune atribuie valoarea "PHP" variabilei $cauta; (n exemplu, se cauta n tablou valoarea stocata n variabila $cauta). Dupa comentariu (care incepe cu //), urmatoarea instructiune obtine numarul elementelor din tablou si stocheaza aceasta valoare n variabila $limita. Instructiunea for functioneaza ca mai nainte; de data aceasta nsa, corpul sau contine alte instructiuni si se executa o alta operatie. O instructiune echo afiseaza valoarea fiecarui element al tabloului pe masura ce parcurgerea tabloului avanseaza. Instructiunea if testeaza fiecare element si afiseaza un mesaj daca valoarea elementului este una si aceeasi cu valoarea variabilei $cauta. Iata rezultatul rularii exemplului: Determinarea unei identitati cu Perl Determinarea unei identitati cu PHP PHP este un limbaj excelent. Determinarea unei identitati cu Python
Instructiunea break
Observati ca parcurgerea continua chiar si dupa gasirea valorii cautate. Cnd se cauta ntr-un tablou, executia cautarii poate fi oprita dupa gasirea elementului dorit; continuarea parcurgerii in Array nu face dect sa iroseasca resursele calculatorului, fara a afecta rezultatele operatiei. Pentru a opri executia unei parcurgeri, puteti folosi instructiunea break, care determina ncheierea imediata a buclei care o contine. Iata cum se poate revizui exemplul anterior, astfel nct sa includa o instructiune break: <?php $limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python"); $cauta = PHP; // se cauta in tabloul $limbaje valoarea $cauta $limita = count($limbaje); for ($i = 0; $i < $limita; $i++) { echo "<br />Determinarea unei identitati cu $limbaje[$i]"; if ($cauta == $limbaje[$i]) { echo "<br />$cauta este un limbaj excelent."; break; } } ?> Acum, dupa stabilirea unei identitati, instructiunea break provoaca sistarea buclei for. Iata datele de iesire rezultate, care acum omit examinarea inutila a elementului tabloului asociat cu limbajul "Python":
Determinarea unei identitati cu Perl Determinarea unei identitati cu PHP PHP este un limbaj excelent.
Instructiunea continue
O instructiune corelata cu instructiunea break este continue. Instructiunea continue opreste secventa curenta a buclei, determinnd evaluarea imediata a expresiilor de incrementare si de test. Ca un exemplu, sa presupunem ca doriti sa cautati n tabloul $limbaje pentru a determina numarul limbajelor care au nume scurte, adica nume alcatuite din maximum 4 caractere. Iata un exemplu care executa aceasta prelucrare a datelor: <?php $limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python"); $scurt = 0; $limita = count($limbaje); for ($i = 0; $i < $limita; $i++) { $n = strlen($limbaje[$i]); echo "<br />$limbaje[$i] are $n caractere lungime"; if ($n > 4) continue; $scurt++; } echo "<br />Au fost gasite $scurt limbaje cu nume scurte."; ?> O instructiune de atribuire stabileste valoarea initiala a variabilei $scurt la zero, folosita pentru a numara numele scurte gasite. Instructiunea for se aseamana celor folosite anterior. Corpul acestei instructiuni difera, desigur, de cele folosite anterior. Valoarea variabilei $n este stabilita ca fiind egala cu numarul caracterelor care compun numele limbajului, folosind functia strlen(), care calculeaza lungimea unui sir. Daca instructiunea if stabileste ca elementul curent al tabloului face referire la un limbaj cu nume lung, se executa instructiunea continue. Instructiunea continue determina trecerea parcurgerii la urmatorul element din tablou, fara a mai executa expresia "$scurt++"; daca nu au mai ramas elemente n tablou, bucla for si ncheie executia. La finalizarea parcurgerii, o instructiune echo afiseaza numarul numelor scurte de limbaje gasite n tablou. Iata rezultatul: Perl are 4 caractere lungime PHP are 3 caractere lungime Python are 6 caractere lungime Au fost gasite 2 limbaje cu nume scurte. - O lista cu 37 functii utile in lucrul cu Array gasiti la pagina -> Functii pentru Array
- Transforma cheile din primul parametru (array) in majuscule sau litere mici, dupa cum e specificat la "case" (CASE_UPPER sau CASE_LOWER). Default e CASE_LOWER. Daca "array" nu e o matrice, returneaza FALSE. <?php $aray = array("FirSt"=>1, "SecOnd"=>8); print_r(array_change_key_case($aray, CASE_UPPER)); // Va afisa: ?> Array ( [FIRST] => 1 [SECOND] => 8 )
2. array_chunk(array, nr) - Imparte "array" intr-un numar de sub-matrici, precizat la "nr", indexate de la 0. Daca "array" nu are elemente, returneaza NULL. <?php $aray = array('a', 'b', 'c', 'd', 'e'); print_r(array_chunk($aray, 2)); // Va afisa: Array ( [0]=>Array ( [0]=>a [1]=>b ) [1]=>Array ( [0]=>c [1]=>d ) [2]=>Array ( [0]=>e ) ) ?> 3. array_combine(array_k, array_v) - Creaza un array folosind valorile din "array_k" pentru chei, iar elementele din "array_v" pentru valorile lor. Numarul de elementele din cele 2 matrici trebuie sa fie egal, in caz contrar returneaza FALSE. <?php $a = array('a', 'b', 'c'); $b = array('x', 'y', 'z'); $c = array_combine($a, $b); print_r($c); // Va afisa: ?> Array ( [a] => x [b] => y [c] => z )
4. array_count_values(array) - Returneaza o matrice cu numarul de repetari a fiecarui element din "array". <?php $aray = array('a', 8, 'a', 'b', 'a', 8, 'c'); $re = array_count_values($aray); print_r($re); // Return: ?> Array ( [a] => 3 [8] => 2 [b] => 1 [c] => 1 )
5. array_diff(array1, array2) - Returneaza o matrice cu elementele din "array1" care nu se gasesc in "array2".
<?php $aray1 = array("a"=>"green", "blue", "red"); $aray2 = array("b"=>"green", "yellow", "red"); $re = array_diff($aray1, $aray2); print_r($re); // Va afisa: ?> Array ( [1] => blue )
6. array_flip(array) - Schimba valorile si cheile intre ele. Din valorile care se repeta o pastreaza pe ultima. <?php $aray = array("a"=>1, "b"=>2, "c"=>2); $re = array_flip($aray); print_r($re); // Va afisa: ?> Array ( [1] => a [2] => c )
7. array_intersect(array1, array2, ...) - Returneaza o matrice cu toate valorile din "array1" care se gasesc in toati ceilalti "array" dati ca parametri. <?php $aray1 = array("a"=>1, "b"=>'a', "c"=>'d', 'e'); $aray2 = array(8, 'a', 'd'); $aray3 = array(1, 'a', 'c', 'd'); $re = array_intersect($aray1, $aray2, $aray3); print_r($re); // Return: ?> Array ( [b] => a [c] => d )
8. array_key_exists(cheie, array) - Returneaza TRUE daca "cheie" este o cheie (index) in matricea "array", in caz contrar returneaza FALSE. <?php $aray = array("a"=>1, "b"=>'a', "mp"=>'d'); if (array_key_exists('mp', $aray)) { echo 'Cheia exista'; } ?> 9. array_keys(array, val) - Returneaza o matrice cu toate cheile din "array". Parametrul "val" e optional, daca e specificat, va returna doar cheile cu valoarea "val".
<?php $aray = array("a"=>1, "b"=>'c', 'd', "mp"=>'d'); $re = array_keys($aray); print_r($re); // Va afisa: ?> Array ( [0] => a [1] => b [2] => 0 [3] => mp )
10. array_map("functie", array) - Aplica functia pentru fiecare element din "array" <?php function f_test($val) { return $val+2; } $aray = array("a"=>1, "b"=>'c', 2); $aray = array_map("f_test", $aray); print_r($aray); // Return: ?> Array ( [a] => 3 [b] => 2 [0] => 4 )
11. array_merge($array1, $array2, ...) - Uneste mai multe array in unul singur. Daca au cheie de tip sir identice, va fi pastrata valoarea ultimei chei. <?php $aray1 = array("a"=>1, 3, 4); $aray2 = array("a"=>2, 8); $re = array_merge($aray1, $aray2); print_r($re); // Va afisa: Array ( [a] => 2 [0] => 3 [1] => 4 [2] => 8 ) ?> 12. array_pop(array) - Elimina ultimul element din "array", care va fi transferat ca valoarea returnata de "array_pop()". Daca parametru nu e matrice sau e gol, returneaza NULL. <?php $aray = array("a"=>1, 3, 4); $re = array_pop($aray); // $aray va avea acum: echo $re; ?> // 4 array("a"=>1, 3);
<?php $aray = array(1, 2, 3, 4); echo array_product($aray); ?> 14. array_rand(aray, nr)
// 24
- Preia aleator un "nr" de chei din "array", respectand ordinea lor. Daca "nr" e 1, va returna o cheie aleasa aleator. Altfel, returneaza o matrice cu acele chei preluate aleator. <?php $aray = array('x'=>'tutorial', 'y'=>8, 'z'=>'php', 'curs'); $ar_keys = array_rand($aray, 3); // Preia aleator 3 chei, si le aranjaza succesiv in $ar_keys // Parcurge matricea cu cheile alese si afiseaza valoare corespunzatoare fiecareia for($i=0; $i<count($ar_keys); $i++) { $key = $ar_keys[$i]; echo $aray[$key]. ' - '; } // Return: ?> tutorial - 8 - php -
15. array_reverse(array) - Returneaza "array" cu ordinea elementelor inversata. <?php $aray = array(1, 2, 3, 'a', 'b'=>'c'); $re = array_reverse($aray); print_r($re); // Return: Array ( [b] => c [0] => a [1] => 3 [2] => 2 [3] => 1 ) ?> 16. array_search("val", array) - Returneaza cheia din "array" care are valoarea "val", sau FALSE daca nu exista. Cautarea e "case-sensitive" <?php $aray = array(1, 2, 3, 'a', 'b'=>'c'); $re = array_search('c', $aray); echo $re; ?> b
17. array_shift(array) - Elimina primul element din "array", care va fi transferat ca valoarea returnata de "array_shift()". Cheile vor fi renumerotate de la 0. Daca parametru nu e matrice sau e gol, returneaza NULL. <?php $aray = array("a"=>1, 3, 4); $re = array_shift($aray); // $aray va avea acum: array(3, 4);
// 1
18. array_slice(array, start, nr) - Returneaza un "nr" din elementele lui "array', incepand de la elementul numarul "start" (primul e 0), cate elemente arata "nr". Daca "nr" nu e specificat, va fi considerat pana la ultimul. <?php $aray = array("a"=>1, 3, 4, 5, 6, 7); $re = array_slice($aray, 2, 3); // $re va avea: array(4, 5, 6) $re = array_slice($aray, 3); // $re va avea: array(5, 6, 7 ?> 19. array_sum(array) - Returneaza suma elementelor din "array" <?php $aray = array(1, 2, 3, 4); echo array_sum($aray); ?> 20. array_unique(array) - Returneaza matricea "array" fara valorile duplicate, acestea fiind luate o singura data. <?php $aray = array(1, 2, 1, 4, 3, 4); $aray = array_unique($aray); ?> 21. array_values(array) - Returneaza o matrice cu toate valorile din "array", ordonate numeric de la 0. <?php $aray = array("a"=>1, "b"=>'c', 'd', "mp"=>'d'); $re = array_values($aray); print_r($re); // Va afisa: ?> Array ( [0] => 1 [1] => c [2] => d [3] => d )
// 10
// $aray va avea:
array(1, 2, 4, 3)
22. arsort(array) - Sorteaza un "array" cu valorile ordonate in ordine inversa alfabetic, pastrand corelatia dintre chei si valori. In caz de succes returneaza TRUE, altfel, FALSE. <?php $aray = array('c', "b"=>'xy', 'pm', "mp"=>'de'); arsort($aray); // $aray va deveni: ?> array("b"=>'xy', 'pm', "mp"=>'de', 'c')
23. asort(array) - Sorteaza un "array" cu valorile ordonate in ordine alfabetica, pastrand corelatia dintre chei si valori. In caz de succes returneaza TRUE, altfel, FALSE. <?php $aray = array('c', "b"=>'xy', 'pm', "mp"=>'de'); arsort($aray); // $aray va deveni: ?> 24. count(array) - Returneaza numarul de elemente din "array" <?php $aray = array('c', "b"=>'xy', 'pm', "mp"=>'de'); echo count($aray); // 4 ?> 25. current(array); - Returneaza valoarea elementului curent din "array", daca nu are elemente returneaza FALSE. Fiecare matrice are un pointer intern, care prima data e setat la primul element. <?php $aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs'); echo current($aray); // php ?> 26. end(array); - Muta pointerul din "array" la ultimul element si returneaza valoarea lui, daca nu are elemente returneaza FALSE. <?php $aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs'); echo end($aray); // curs ?> 27. implode("separator", array); - Transforma "array" in sir (string), adaugand valorile intr-un sir, separate de ceea ce e specificat la "separator". <?php $aray = array('www', 'marplo', 'net'); $sir = implode('.', $aray); echo $sir; ?> // www.marplo.net array('c', "mp"=>'de', 'pm', "b"=>'xy')
28. in_array("val", array) - Verifica daca o matrice contine o anumita valoare. Returneaza TRUE daca vreunul din elementele din "array" are valoarea "val", in caz contrar FALSE.
<?php $aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs'); if (in_array('tutorial', $aray)) { // Se executa ce se vrea } ?> 29. key(array) - Returneaza cheia elementului curent la care se afla pointerul <?php $aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs'); end($aray); // Muta pointerul la ultimul element echo key($aray); // mp ?> 30. krsort(array) - Sorteaza un "array" dupa chei ordonate in ordine inversa alfabetic, pastrand corelatia dintre chei si valori. In caz de succes returneaza TRUE, altfel, FALSE. <?php $aray = array('li'=>'php', "free"=>'tutorial', 'mysql', "mp"=>'curs'); krsort($aray); // $aray va deveni: ?> 31. ksort(array) - Sorteaza un "array" dupa chei ordonate in ordine alfabetica, pastrand corelatia dintre chei si valori. In caz de succes returneaza TRUE, altfel, FALSE. <?php $aray = array('li'=>'php', "free"=>'tutorial', 'mysql', "mp"=>'curs'); ksort($aray); // $aray va deveni: ?> array('mysql', "free"=>'tutorial', 'li'=>'php', "mp"=>'curs') array("mp"=>'curs', 'li'=>'php', "free"=>'tutorial', 'mysql')
32. natcasesort(array) - Sorteaza un "array" in ordine alfabetica a valorilor, case-insensitive, folosind ordinea naturala a numerelor. In caz de succes returneaza TRUE, altfel, FALSE. <?php $aray = array('li'=>'Php', "free"=>'tutorial', 'MySQL', "mp"=>'curs'); natcasesort($aray); // $aray va deveni: ?> 33. next(array); - Avanseaza pointerul din "array" inainte cu un element si returneaza valoarea, daca nu are elemente returneaza FALSE. array("mp"=>'curs', 'MySQL', 'li'=>'Php', "free"=>'tutorial')
<?php $aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs'); echo next($aray); // tutorial ?> 34. prev(array); - Muta pointerul din "array" inapoi cu un element si returneaza valoarea, daca nu are elemente returneaza FALSE. <?php $aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs'); end($aray); // Duce pointerul la ultimul element echo prev($aray); // mysql ?> 35. reset(array); - Readuce pointerul din "array" la primul element si returneaza valoarea lui, daca nu are elemente returneaza FALSE. <?php $aray = array('php', "free"=>'tutorial', 'mysql', "mp"=>'curs'); next($aray); // Avanseaza pointerul cu un element echo reset($aray); // php ?> 36. rsort(array) - Sorteaza un "array" in ordine inversa alfabetic a valorilor (literele mici inaintea celor mari), stergand cheile initiale, devenind un Array asociativ cu chei de la 0. In caz de succes returneaza TRUE, altfel, FALSE. <?php $aray = array('li'=>'Php', "free"=>'tutoriale', 'MySQL', "mp"=>'curs'); rsort($aray); // $aray va deveni: ?> 37. sort(array) - Sorteaza un "array" in ordine alfabetica a valorilor (literele mari inaintea celor mici), stergand cheile initiale, devenind un Array asociativ cu chei de la 0. In caz de succes returneaza TRUE, altfel, FALSE. <?php $aray = array('li'=>'Php', "free"=>'tutoriale', 'MySQL', "mp"=>'curs'); rsort($aray); // $aray va deveni: ?> 38. shuffle(array) - Amesteca aleator elementele din "array". Sterge cheile initiale, devenind un Array asociativ cu chei de la 0. In caz de succes returneaza TRUE, altfel, FALSE. array('MySQL', 'Php', 'curs', 'tutoriale') array('tutoriale', 'curs', 'Php', 'MySQL')
<?php $aray = array('li'=>'Php', "free"=>'tutoriale', 'MySQL', "mp"=>'curs'); shuffle($aray); // $aray va avea elementele amestecate aleator ?>
} } ?> - Instructiunea foreach exterioara obtine cate un Array asociat cu fiecare limbaj; a doua instructiune foreach, interioara, parcurge fiecare Array obtinut de prima instructiune foreach. Iata rezultatul: PHP : simplu PHP : popular Python : simplu Python : nepopular Pearl : dificil Pearl : popular
3. Functia key()
Functia key() este corelata cu functia current(). Daca functia current() returneaza valoarea asociata elementului curent, functia key() returneaza cheia asociata elementului curent. Iata un exemplu care ilustreaza modul de operare al acestei functii: <?php $limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");
$curent = current($limbaje); $cheie = key($limbaje); echo "<br />functia current() a returnat $curent"; echo "<br />functia key() a returnat $cheie"; ?> Iata datele de iesire ale exemplului: functia key() a returnat 10
4. Functia each()
O alta functie utila n parcurgerea tablourilor este each(). Functia each() returneaza perechea "cheie-valoare" care se afla la pozitia curenta din tabloul specificat. Perechea "cheie-valoare" este returnata sub forma unui Array asociativ cu patru elemente, dupa cum urmeaza: Cheie Valoare 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]; echo "<br />zero=$zero"; echo "<br />unu=$unu"; echo "<br />cheie=$cheie"; echo "<br />valoare=$valoare"; ?> Iata datele de iesire ale exemplului: zero=10 unu=Perl cheie=10 valoare=Perl
5. Functia list()
O alta functie utila n lucrul cu tablouri este functia list(), aceasta va permite sa atribuiti valori la numeroase variabile n cadrul unei instructiuni. Functia list() este deseori folosita cu functia each(), deoarece functia list() faciliteaza accesul separat la cheia si la valoarea returnate de functia each(). Forma generala de utilizare a functiei list() este urmatoarea: list($var1, $var2, .., $varn) = valoare_tablou; Fiecare dintre variabilele specificate, de la $var1 la $varn, primeste o valoare din tabloul
"valoare_tablou". ntr-un fel, functia list() este opusa functiei array(), deoarece functia list() mparte un tablou ntr-o serie de valori scalare, n timp ce functia array() construieste un tablou dintr-o serie de valori scalare. Iata un exemplu care ilustreaza modul de utilizare a functiei list(): <?php $limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python"); list($cheie, $valoare) = each($limbaje); echo "<br />cheie = $cheie, valoare = $valoare"; $urmator = next($limbaje); echo "<br />urmator = $urmator"; ?> Iata datele de iesire ale exemplului: cheie = 10, valoare = Perl urmator = Python PHP contine peste 40 de functii pentru lucrul cu tablourile. De exemplu, functia array_search() faciliteaza cautarea ntr-un tablou. Pentru informatii despre aceasta functie si despre alte functii utilizate n lucrul cu tablouri, vizitati site-ul 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. Daca dorim sa sortam in ordine inversa alfabetic, folosim functia rsort() Iata acelasi exemplu, da cu functia rsort() <?php $arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan'); rsort($arr); foreach($arr as $key=>$nume) { echo "<br />Cheie=$key Valoare=$nume"; } ?> Acum rezultatul afisat este urmatorul : Cheie=0 Valoare=Popescu Cheie=1 Valoare=Dan Cheie=2 Valoare=Cristian Cheie=3 Valoare=Avram - Se observa ca si in acest caz au fost alterate valorile initiale ale cheilor. Pentru a sorta matricea "$arr" pastrand corelarea initiala dintre valori si cheile corespunzatoare se folosesc functiile asort(), respectiv arsort(). Incercati-le singuri. In afara de acestea mai sunt si alte functii utile pentru sortarea tablourilor. Iata un tabel care prezinta functiile folositoare pentru sortarea unui tablou, impreuna cu rezultatul aplicarii fiecarei functii. Vom lua ca model pentru exemplificare urmatoarea matrice: Functie sort() asort() rsort arsort ksort krsort $limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python"); Operatia efectuata Rezultat 0 => PHP - Sortarea unui tablou n functie de valoare, in ordine alfabetica, fara sa se tina 1 => Perl cont de cheile initiale 2 => Python 20 => PHP - Sortarea unui tablou n functie de valoare, in ordine alfabetica, pastrand 10 => Perl corelarea initiala dintre valori si cheile corespunzatoare 21 => Python 0 => Python - Sortarea unui tablou n functie de valoare, in ordine invers alfabetica, fara sa 1 => Perl se tina cont de cheile initiale 2 => PHP 21 => Python - Sortarea unui tablou n functie de valoare, in ordine invers alfabetica, pastrand 10 => Perl corelarea initiala dintre valori si cheile corespunzatoare 20 => PHP 10 => Perl - Sortarea unui tablou n functie de cheie, in ordine ascendenta 20 => PHP 21 => Python 21 => Python - Sortarea unui tablou n functie de cheie, in ordine descendenta 20 => PHP 10 => Perl
O modalitate de a executa o cautare fara sensibilitate la diferenta ntre majuscule si minuscule ar fi utilizarea functiei natcasesort(), care sorteaza un tablou folosind o ordine care nu este
sensibila la diferenta ntre majuscule si minuscule. O alta modalitate consta n a utiliza functia usort() sau una dintre functiile sale conexe, n speta uksort() si uasort(). Functia usort() sorteaza valorile din tablou si returneaza un tablou secvential; functia uksort() sorteaza cheile tabloului, iar functia uasort() sorteaza un tablou asociativ. De exemplu, urmatoarele instructiuni creeaza un tablou si l sorteaza ntr-o maniera insensibila la diferenta ntre majuscule si minuscule:
$limbaje = array("Perl", "PHP", "Python"); usort($limbaje, "strcmpcase"); foreach($limbaje as $key=>$nume) { echo "<br />$key => $nume"; }
Functia strcmpcase() este o functie din biblioteca PHP care compara doua siruri fara a tine cont de majuscule sau minuscule. Functia returneaza o valoare negativa daca primul sir este mai mic dect al doilea, zero daca sirurile sunt identice, respectiv o valoare pozitiva daca primul sir este mai mare dect al doilea. Rezultatul va fi :
Pentru mai multe informatii despre functia usort() si despre functiile sale conexe, examinati site-ul www.php.net
In continuare, pentru exemplificare, folosind exemplul de mai sus, sortam matricea "$matrice" alfabetic si apoi transferam matricea intr-un alt sir , de aceasta data sortat (Observati folosirea caracterelor ( \" ) in expresia echo, pentru ca la iesire rezultatul sa contina ghilimele): <?php $matrice = array("Popescu", "Avram", "Cristian", "Dan"); sort($matrice); $sir = implode(" - ",$matrice); echo "<br />Sirul rezultat : \"$sir\""; ?> Acest cod va produce urmatorul rezultat: Sirul rezultat : "Avram - Cristian - Dan - Popescu"
Utilizarea functiilor
nvatati sa apelati functiile nvatati sa atribuiti unei variabile numele unei functii nvatati sa ascundeti mesajele de eroare generate n timpul executiei unei functii nvatati sa folositi date si scripturi aflate n fisierele externe nvatati sa definiti propria functie
Am folosit pana acum de mai multe ori termenul de functii. In cadrul acestei lectii veti nvata mai multe despre utilizarea functiilor si despre modul de definire a propriilor dumneavoastra functii. Functiile reprezinta secvente de cod care sunt apelate foarte frecvent in cadrul codului PHP. Folosirea intensiva a functiilor contribuie la o structurare mai buna a codului; ideea este ca o problema complexa sa o divizam in mai multe sub-probleme, fiecare astfel de subproblema sa fie executata in cadrul unei functii. Pe de alta parte folosirea frecventa a functiilor duce la micsorarea cantitatii de cod scris; prin urmare vom avea un cod care se executa mai eficient.
echo $nr;
Cnd se produce o eroare n timpul executiei unei functii, PHP genereaza mesaje de eroare. Uneori, asemenea mesaje de eroare sunt nedorite. n acest caz, puteti suprima generarea mesajelor de eroare prin adaugarea in fata numelui functiei a caracterului @. De exemplu,, pentru a suprima mesajele de eroare care pot aparea n timpul executiei functiei "f()", scriem aceasta functie dupa cum urmeaza: y = @f(x); Totusi, indicat este sa scrieti scripturi care sa nu genereze erori, ascunderea lor nu rezolva problema ce cauzeaza eroarea. O functie utila, recomandata a fi folosita in script-uri este functia isset() si este cel mai des folosita cu "if()". isset() preia ca argument de obicei o variabila si arata daca aceasta a fost sau nu setata.
De exemplu: isset($nr)
- Functia returneaza TRUE daca variabila "$nr" are setata o valoare (diferita de NULL), in caz contrar returneaza FALSE. Aceasta functie este foarte utila in determinarea caror comenzi sa fie executate in functie daca o anumita variabila a fost setata sau nu. Previne aparitia unor erori care apar in cazuri de variabile nule si ajuta si la securitate. De exemplu, sa presupunem ca avem un cod PHP care vrem sa fie executat numai daca prin adresa URL o fost transmisa o variabila "id", adica o adresa de forma http://www.domeniu.site/script.php?id=un_id, folosim functia isset() astfel: <?php if (isset($_GET['id'])) { // Se executa codul dorit } ?> - $_GET['id'] preia valoarea lui "id" din URL, iar functia isset() verifica daca aceasta valoare exista (daca in URL este "id=ceva"). Daca aceasta exista, returneaza TRUE iar functia "if", avand astfel valoarea TRUE, va executa codul dintre acoladele ei. Functia isset() este utila si pentru situatii de verificarii a inexistentei unei variabile, prin adaugarea caracterului (!) in fata ei. Astfel daca o anumita variabila rezulta a nu fi setata, ii atribuim o valoare sau executam un anume cod special pt. asta. Exemplu: if (!isset($_GET['id'] { die('Pagina apelata este inaccesibila.'); }
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.
Cuvntul cheie "function", "numele_functiei" si "nume_argument" alcatuiesc antetul functiei. Termenul de corp al functiei se refera la instructiunile incluse ntre acolade care urmeaza dupa antetul functiei. Instructiunile din corpul functiei sunt executate atunci cnd functia este apelata. Numele functiilor nu prezinta sensibilitate la diferenta ntre majuscule si minuscule; ca atare, "f()" si "F()" reprezinta referiri la aceeasi functie. Daca doriti sa definiti o functie care nu are argumente, puteti omite "nume_argument"; daca doriti sa definiti o functie cu mai multe argumente, puteti include argumente suplimentare dupa "nume_argument", fiecare argument fiind separat de vecinul sau printr-o virgula. Parantezele si numele argumentelor incluse ntre acestea poarta numele de lista cu argumente. Ca exemplu, iata o functie care calculeaza aria unui dreptunghi: <?php function arie($lungime, $latime) { return $lungime * $latime; } ?> Lista cu argumente a functiei "arie()" include argumentele $latime si $inaltime. Corpul functiei este alcatuit dintr-o singura instructiune; cu toate acestea, corpul unei functii poate contine mai multe instructiuni. Daca doriti ca o functie sa returneze o valoare, trebuie sa determinati functia sa execute o instructiune return care furnizeaza valoarea respectiva. Instructiunea return determina sistarea executarii functiei; nu este necesar ca aceasta sa fie
ultima instructiune fizica din corpul functiei. Daca definiti o functie care nu are nici o instructiune return (sau pentru date de iesire, precum "echo"), functia va returna valoarea speciala NULL.
6. Functii recursive
Este posibil ca o functie din PHP sa se auto-apeleze. O functie care procedeaza astfel se numeste "functie recursiva". Totusi, daca nu aveti experienta de programare, este recomandat sa nu scrieti functii recursive. Cu toate acestea, puteti scrie accidental sau intalni o asemenea functie, deci este util sa stiti unele notiuni referitoare la aceasta. Studiati scriptul urmator care defineste si invoca o functie recursiva simpla: <?php function recursor($nr) { $nr++; if ($nr<8) { return recursor($nr);
} return $nr; } $x = recursor(3); echo $x; ?> - Daca rulati acest script, rezultatul afisat va fi 8. - Variabila "$x" primeste ca valoare functia "recursor()" careia ii transmite ca argument numarul 3. - Functia "recursor()" incrementeaza cu o unitate valoarea argumentului, prin "$nr++;" care devine 4, apoi conditia "if ($nr<8)" verifica daca aceasta variabila din functie e mai mica decat 8, in caz afirmativ se executa comanda "return recursor($nr);" care sisteaza executia altui cod din functie si auto-apeleaza iar functia (cu noua valoare a lui "$nr" ca argument) care iar incrementeaza valoarea lui "$nr" si verifica din nou conditia care iar autoapeleaza functia, ... si tot asa pana cand "$nr" va avea valoarea 8 si la verificare conditiei "if" aceasta returneaza FALSE si se trece mai departe la executia comenzii "return $nr;" care va returna 8 ca valoare a variabilei "$x". Functia "echo" va afisa valoarea lui "$x", adica 8.
valoare a argumentului $rata. Astfel, la prima invocare a functiei, pentru "impozit1", $rata are valoarea 0.09, specificata drept al doilea argument al functiei. Cu toate acestea, la a doua invocare a functiei, pentru "impozit2", $rata are valoarea 0.0725 deoarece este specificata valoarea unui singur argument, si astfel "$rata" a preluat valoarea prestabilita initial. - O lista cu mai multe functii php matematice este la pagina -> Functii PHP matematice
2. base_convert(nr, baza1, baza2) - Converteste un numar, "nr", din baza1 in baza2. Rezultatul returnat este un sir cu "nr" convertit in baza2. <?php $nr = 18; // Afiseaza numarul 18 convertit din baza 10 in baza 2 (cod binar) echo base_convert($nr, 10, 2); // 10010 ?> 3. bindec('sir_binar') - Returneaza echivalentul numeric (decimal) al sirului binar din parametrul "sir_binar". <?php echo bindec('10010'); echo bindec('1000'); ?> 4. ceil(nr) - Returneaza valoarea rotunjita a lui "nr" la urmatorul (mai mare) intreg. <?php echo ceil(7.8); echo ceil(5); echo ceil(-2.3); echo ceil(1.2); ?> 5. cos(radian) - Returneaza valoarea cosinus a gradelor de cerc specificate la "radian". // 8 // 5 // -2 // 2 // 18 // 8
// 0.15425144988758 // -0.44807361612917
- Returneaza un sir cu valoarea binara a numarului "nr". <?php echo decbin(-5); echo decbin(88); ?> 7. dechex(nr) - Returneaza un sir cu valoarea hexazecimala a numarului "nr". <?php echo decbin(-5); echo decbin(88); ?> 8. decoct(nr) - Returneaza un sir cu valoarea octala a numarului "nr". <?php echo decbin(-5); echo decbin(88); ?> 9. floor(nr) - Returneaza valoarea rotunjita a lui "nr" la anteriorul (mai mic) intreg. <?php echo floor(7.8); echo floor(5); echo floor(-2.5); echo floor(1.2); ?> 10. fmod(x, y) - Returneaza valoarea ramasa a lui "x" impartit la "y", care nu mai e multiplu de "y". <?php $x = 8.5; $y = 3; $r = fmod($x, $y); ?> 11. hexdec('hex') - Returneaza valoarea zecimala a sirului hexazecimal "hex". <?php echo hexdec('ee'); // 238 // 7 // 5 // -3 // 1 // 37777777773 // 130 // fffffffb // 58 // 11111111111111111111111111111011 // 1011000
// 1022
- Returneaza lungimea ipotenozei unui triunghi dreptunghic care are lungimea catetelor "c1" si "c2". <?php echo hypot(3, 4); ?> 13. is_infinite(val) - Returneaza TRUE daca valoarea lui "val" este un numar infinit (precum log(0)), altfel, returneaza FALSE. <?php $nr = log(0); if (is_infinite($nr)) echo 'Nr. infinit'; ?> 14. lcg_value() - Returneaza un numar aleator intre 0 si 1. <?php echo lcg_value(); ?> 15. log10(nr) - Returneaza logaritmul in baza 10 a lui "nr".. <?php echo log10(1000); ?> 16. log(nr, baza) - Returneaza logaritm de "nr" in baza "baza". Daca al doilea parametru nu e specificat, va returna logaritmul natural (in baza e). <?php echo log(9, 3); ?> // 2 // 3 // 0.64820835969476 // 5
17. max(nr1, nr2, ...) - Returneaza cel mai mare numar dintre cele date la parametri. <?php echo max(9, 3, 8, 78, 55); ?> 18. min(nr1, nr2, ...) - Returneaza cel mai mic numar dintre cele date la parametri. // 78
// 3
- Returneaza un numar aleator cuprins intre numerele "min" si "max". Similara este si functia rand(), dar "mt_rand()" este de 4 ori mai rapida. <?php echo mt_rand(9, 55); ?> 20. octdec('oct') - Returneaza valoarea zecimala a sirului octal "oct". <?php echo octdec('42'); ?> 21. pi() - Returneaza valoarea aproximativa a lui PI. La fel ca si constanta M_PI. <?php echo pi(); echo M_PI; ?> // 3.1415926535898 // 3.1415926535898 // 34 // 47
22. pow(nr, putere) - Returneaza valoarea obtinuta din "nr" la puterea "putere". <?php echo pow(4, 3); ?> 23. round(nr) - Returneaza valoarea rotunjita a lui numar la intregul ce mai apropiat. <?php echo round(7.8); echo round(5); echo round(-2.5); echo round(1.2); ?> 24. sin(radian) - Returneaza valoarea sinus a gradelor de cerc specificate la "radian". <?php echo sin(30); echo sin(90); ?> 25. sqrt(nr) // -0.98803162409286 // 0.89399666360056 // 8 // 5 // -3 // 1 // 64
- Returneaza radical din "nr". <?php echo sqrt(225); ?> 26. tan(radian) - Returneaza valoarea tangenta a gradelor de cerc specificate la "radian". <?php echo tan(30); echo tan(90); ?> // -6.4053311966463 // -1.9952004122082 // 15
27. is_numeric(val) - Returneaza TRUE daca "val" e o valoare numerica, altfel, FALSE. <?php $x = 32/3; if (is_numeric($x)) echo "E un numar si are valoarea: $x"; valoarea: 10.666666666667 ?>
// E un numar si are
Variabilele globale sunt create n exteriorul functiei, n timp ce variabilele locale sunt create n interiorul unei functii.
echo "Suma este ". Suma(); ?> - Functia "Suma()" foloseste variabilele $var1 si $var2 declarate anterior, dar aceste variabile nu au domeniu de valabilitate in interiorul functiei. Prin urmare rezultatul functiei este NULL. Pentru a rezolva aceasta problema vom declara cele doua variabile ca fiind variabile globale, ca in exempul urmator: <?php $var1 = 135; $var2 = 250; function Suma() { GLOBAL $var1, $var2; return $var1 + $var2; } echo "Suma este ". Suma(); ?> - In exemplul de mai sus declaratia: "GLOBAL $var1, $var2" face ca variabilele $var1 si $var2 sa fie recunoscute si in interiorul functiei. - Puteti scrie si cu litere mici "global", dar e mai usor de recunoscut cu litere mari. O alta metoda prin care putem solutiona aceasta problema este prin folosirea variabilei PHP predefinite $GLOBALS, dupa cum puteti vedea in exemplu urmator: <?php $var1 = 135; $var2 = 250; function Suma() { return $GLOBALS['var1'] + $GLOBALS['var2']; } echo "Suma este ". Suma(); ?> $GLOBALS este o variabila predefinita, este de fapt un array ; elementele acestei matrice au cheia egala cu numele variabilelor declarate si valoarea egala cu cea a variabilelor declarate. $GLOBALS este o variabila superglobala, ea va fi recunoscuta in orice script. Puteti folosi oricare din cele doua variante prezentate: instrucrtiunea GLOBAL sau variabila $GLOBALS. In cele doua exemple prezentate mai sus rezultatul afisat va fi acelasi : Suma este 385
$x = 2; echo "<br />In corpul scriptului x = $x"; v_local(); echo "<br />In corpul scriptului x = $x"; ?> Cand executati acest script, veti primi urmatoarele rezultate: In corpul scriptului x = 2 In corpul functiei x = 5 In corpul scriptului x = 2 Remarcati diferenta dintre cele doua variabile $x, chiar daca numele variabilelor este acelasi. Cand este apelata functia v_local(), $x ia valoarea 5, in rest, inainte si dupa, ia valoarea 2. Domeniul de existenta al variabilei globale $x nu se extinde n interiorul corpului functiei v_local(), iar domeniul de existenta al variabilei locale $x nu se extinde dincolo de corpul functiei respective. Cu alte cuvinte, domeniile de existenta ale celor doua variabile sunt complet distincte.
Observati ca variabila locala $x, definita n cadrul functiei v_local(), este creata din nou la fiecare apelare a functiei, n consecinta, valoarea sa este ntotdeauna afisata ca fiind egala cu 1. Prin contrast, variabila statica $x, definita n cadrul functiei v_static(), si pastreaza valoarea de la un apel al functiei la urmatorul; ca atare, valoarea sa creste de fiecare data cnd este executata functia.
4. Utilizarea referintelor
In mod prestabilit, argumentele transferate unei functii PHP sunt transmise prin valoare, ceea ce nseamna ca valorile argumentelor sunt copiate si functiile utilizeaza copii ale valorilor argumentelor lor, nu argumentele n sine. Ca o consecinta, o functie PHP nu poate modifica valorile argumentelor sale. Totusi, puteti stabili ca o functie sa aiba posibilitatea de a modifica valoarea unui argument, specificnd ca argumentul sa fie transferat prin referinta. Cnd un argument este transferat prin referinta, valoarea sa nu este copiata; functia lucreaza cu valoarea argumentului si are libertatea de a modifica acea valoare. Pentru a specifica faptul ca un argument urmeaza a fi transferat prin referinta, inaintea argumentului va fi adaugat un caracter ampersand (&). Puteti atasa acest caracter la argument n antetul functiei sau n apelul la functie. Iata un exemplu care prezinta apelul prin valoare si apelul prin referinta: <?php function p_valoare($a) { $a = 1; } function p_referinta(&$a) { $a = 1; } $b = 0; p_valoare($b); echo "<br /> \$b = $b"; $b = 0; p_valoare(&$b); echo "<br /> \$b = $b"; $b = 0; p_referinta($b); echo "<br /> \$b = $b"; ?> Dupa rulati acest script, veti obtine urmatoarele date de iesire: $b = 0 $b = 1 $b = 1 Retineti ca scriptul contine doua functii, si anume "p_valoare()" si "p_referinta()". Fiecare functie preia un singur argument, denumit $a. Antetul functiei "p_referinta()" specifica faptul ca argumentul sau este transferat prin referinta; argumentul functiei "p_valoare()" este transferat prin valoare. Primul paragraf al programului invoca functia "p_valoare()", transfernd argumentul prin valoare. n consecinta, functia lucreaza cu o copie a argumentului sau, iar valoarea variabilei $b nu se modifica. Cel de-al doilea paragraf al programului invoca de asemenea functia "p_valoare()"; dar,
foloseste un caracter ampersand (&) pentru a determina transferul prin referinta al valorii variabilei $b. n consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 n 1. Cel de-a treilea paragraf al programului invoca functia "p_referinta()". Antetul functiei respective foloseste un caracter ampersand (&) pentru a specifica faptul ca valoarea argumentului sau este transferata prin referinta, n consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 n l. Prin utilizarea referintelor se evita suprasarcina de copiere a valorilor argumentelor si implicit se obtine o viteza mai mare de executie a programului. Cu toate acestea, programele devin astfel mai dificil de nteles, iar referintele sau apelurile prin referinta pot cauza erori de program. Cel mai indicat este sa evitati referintele, acolo unde este posibil, si sa definiti functii care returneaza valori, si nu functii care modifica valorile propriilor argumente. In versiunile PHP 5+, transmiterea la functiei a unui parametru prin referinta "Call-time passby-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.
\n - salt la linie noua \r - retur de car (rand nou) \t - caracter de tabulare pe orizontala \\ - backslash \$ - simbolul dolarului \" - ghilimele duble \xxx - caracterul asociat valorii ASCII xxx, exprimata sub forma unui numar in octal \xnn - caracterul asociat valorii ASCII xxx, exprimata sub forma unui numar n hexazecimal
Ultimele doua secvente escape prezentate mai sus folosec un cod ASCII (America Standard Code for Information Interchange) pentru reprezentarea unui caracter. Codurile ASCII sunt valori ntregi, care sunt cuprinse ntre 0 si 255; fiecare litera sau simbol folosit frecvent n limbile vest-europene are asociat un cod ASCII. De exemplu, codul ASCII asociat literei A este 65, iar codul asociat cifrei l este 49. Prima secventa escape necunoscuta (\xxx) va permite sa folositi reprezentarea n octal (baza 8) a unui cod ASCII pentru specificarea caracterului corespunzator. De exemplu, valoarea zecimala 65 (care este codul ASCII al literei A) poate fi reprezentata n octal sub forma 101. Ca atare, puteti reprezenta litera A folosind secventa escape "\101". Cea de-a doua secventa escape necunoscuta (\xnn) va permite sa folositi reprezentarea hexazecimala (n baza 16) a unui cod ASCII pentru specificarea caracterului corespunzator. De exemplu, valoarea zecimala 65 (care este codul ASCII al literei A) poate fi reprezentat sub forma hexazecimala 41. Ca atare, puteti reprezenta litera A cu ajutorul secventei escape "\41". Valoarea unui numar zecimal este suma produselor dintre fiecare cifra care l compune si o putere a lui 10. De exemplu, numarul zecimal 123 are valoarea l x 10 la puterea 2 + 2 x 10 la puterea 1 + 3 x 10 la puterea 0 = 1x100 + 2x10 + 3x1. Puteti determina valoarea unui numar reprezentat folosind o alta baza prin nlocuirea lui 10 cu valoarea bazei respective ntr-o expresie ca aceea prezentata anterior. De exemplu, valoarea hexazecimala 123 este echivalenta cu valoarea zecimala l x 16 la puterea 2 + 2 x 16 la puterea 1 + 3 x 16 la puterea 0 = l x 156 + 2 x 16 + 3 x l = 291. Similar, valoarea n octal 123 este echivalenta cu valoarea zecimala 1x8 la puterea 2 + 2x8 la puterea 1 + 3x8 la puterea 0 = 1x64 + 2x8 + 3xl=83. Daca vi se pare complicat sa calculam astfel, nu intrati n panica; n continuare veti nvata sa determinati valoarea n octal sau hexazecimal echivalenta cu orice valoare zecimala, folosind functii PHP.
<?php for ($i=33; $i<40; $i++) { $c=chr($i); $octal = decoct($i); $hex = dechex($i); echo "<br /> $i (octal $octal, hex $hex): caracter - $c"; } ?> Scriptul va afisa urmatorul rezultat: 33 (octal 41, hex 21): caracter - ! 34 (octal 42, hex 22): caracter - " 35 (octal 43, hex 23): caracter - # 36 (octal 44, hex 24): caracter - $ 37 (octal 45, hex 25): caracter - % 38 (octal 46, hex 26): caracter - & 39 (octal 47, hex 27): caracter - '
- Includerea datelor formatate in sir se face in ordinea adaugarii variabilelor intre parantezele functiei "sprintf()". - Va afisa "Aceasta este lectia 13 din cursul PHP". Sirul de formatare consta dintr-o serie de caractere si directive ordinare. Un caracter ordinar este orice caracter, n afara caracterului "%". Caracterele ordinare sunt pur si simplu copiate la iesire. Directivele reprezinta secvente de caractere care ncep cu simbolul "%"; aceste determina modul n care va fi formatat argumentul corespunzator. O directiva simpla, cum este cea din exemplul precedent, poate consta dintr-un caracter "%" urmat de un specificator de tip, precum "d", care arata ca argumentul trebuie tratat ca numar zecimal. Cu toate acestea, o directiva mai sofisticata poate include urmatoarele componente, care trebuie sa apara n ordinea indicata:
Specificator de completare (optional): - Un specificator de completare precizeaza caracterul care se va folosi pentru a completa rezultatul pna la dimensiunea ceruta a sirului, n cazul n care caracterul de completare este omis, rezultatul este completat cu spatii. Specificatorul de completare poate fi un caracter spatiu sau un 0 (zero). Un specificator de completare de tip spatiu este folosit frecvent cu sirurile, iar un specificator de completare zero se foloseste mai ales alaturi de numere. Un alt caracter de completare poate fi specificat prin prefixarea acestuia cu un singur semn al citarii ('). De exemplu, pentru a completa un rezultat cu liniute de subliniere, specificati '_ drept caracter de completare. Specificator de aliniere (optional): - Un specificator de aliniere indica daca rezultatul trebuie sa fie aliniat la stnga sau la dreapta. Daca specificatorul de aliniere este omis, rezultatul va fi aliniat la dreapta; daca se indica o cratima (-) drept specificator de aliniere, rezultatul va fi aliniat la stnga. Specificator de latime (optional): - Un specificator de latime este un ntreg care determina numarul minim de caractere ale rezultatului; sau, daca argumentul este de tip double, numarul minim de caractere situate la stnga punctului zecimal. Daca rezultatul contine un numar mai redus de caractere, atunci va contine si caractere de completare. Specificator de precizie (optional): - Un specificator de precizie este un punct zecimal, urmat de un ntreg care determina numarul de cifre dupa punctul zecimal pe care trebuie sa le contina rezultatul. Specificatorul de precizie nu are nici un efect pentru alte tipuri dect double (float). Specificator de tip (obligatoriu): - Specificatorul de tip determina modul de tratare si afisare a argumentului.
Tabelul urmator prezinta specificatorii de tip disponibili. Specificatorii de tip PHP folositi la formatarea sirurilor Specificator de Descriere tip - Trateaza argumentul ca pe un ntreg si l afiseaza ca b valoare binara - Trateaza argumentul ca pe un ntreg si afiseaza caracterul c cu aceeasi valoare ASCII ca si argumentul - Trateaza argumentul ca pe un ntreg si l afiseaza ca d valoare zecimala f - Trateaza argumentul ca pe o valoare de tip double si l
afiseaza ca valoare cu virgula mobila - Trateaza argumentul ca pe un ntreg si l afiseaza ca pe o o valoare scrisa n octal s - Trateaza argumentul ca pe un sir si l afiseaza - Trateaza argumentul ca pe un ntreg si l afiseaza ca numar x hexazecimal, cu litere scrise cu minuscule - Trateaza argumentul ca pe un ntreg si l afiseaza ca numar X hexazecimal, cu litere scrise cu majuscule Daca doriti sa inserati simbolul procentului n datele de iesire ale unui apel la functia printf() sau sprintf(), inserati doua caractere "%". Tabelul urmator prezinta rezultatele aplicarii a diferite siruri de formatare valorilor selectate. Studiati tabelul si verificati daca ati nteles corect modul de operare a specificatorilor din cadrul fiecarui sir de formatare. Remarcati ca, n cazul omiterii cifrelor zecimale, se produce automat o rotunjire. Spatiile au fost nlocuite prin accente circumflexe(^), pentru a facilita determinarea numarului de spatii si a amplasarii acestora. Exemple de rezultate ale utilizarii a diferite siruri de formatare Valoare Format Rezultat 100 %d 100 100 %b 1100100 100 %o 144 100 %x 64 100 %f 100.000000 12.345 %^-10f 12.345000^^^^^^^^ 12.345 %^10f ^^^^^^^^12 .345000 12.345 %^-10.2f 12.35^^^^^^^^ 12.345 %10.2f ^^^^^^^^12.35 test %^-10s test^^^^^^ test %^10s *^^^^^^test Daca utilizarea functiilor printf() si sprintf() pentru formatarea numerelor pare cam greoaie, puteti folosi functia number_format(), care returneaza o valoare de tip sir continnd un rezultat formatat. Puteti apela functia cu unul, doua sau patru argumente: number_format(numar) number_format(numar, zecimale) number_format(numar, zecimale, punct_zecimal, separator_mii)
- Argumentul "numar" specifica valoarea numerica pe care doriti sa o formatati. - Argumentul "zecimale" specifica numarul dorit de cifre zecimale. - Argumentul "punct_zecimal" precizeaza caracterul ce se va folosi drept punct zecimal. - Argumentul "separator_mii' precizeaza caracterul care se va folosi ca separator al miilor. n mod prestabilit, rezultatul este formatat fara zecimale, este inserat un punct (.) naintea cifrelor care compun partea zecimala, respectiv se foloseste o virgula (,) pentru separarea miilor. De exemplu, apelul la functia number_format(1.234, 2) returneaza valoarea 1.23 Functia PHP sscanf(), este complementara functiei printf(). Daca functia printf() genereaza date de iesire formatate, functia sscanf() citeste un sir, l interpreteaza prin referirea la un sir de formatare si stabileste valorile variabilelor specificate n functie de continutul sirului. Sa luam n considerare urmatorul exemplu:
<?php $subiect = "08,25,2008"; $n = sscanf($subiect, "%d,%d,%d", &$luna, &$zi, &$an); echo "Au fost gasite $n valori"; echo "<br /> luna = $luna"; echo "<br /> zi = $zi"; echo "<br /> an = $an"; ?> Datele de iesire ale acestui script sunt: Au fost gasite 3 valori luna = 8 zi = 25 an = 2008
1. Manipularea sirurilor
PHP contine peste 70 de functii care lucreaza cu siruri. Aceasta sectiune descrie cateva functii pe care este posibil sa le utilizati frecvent. Aceste functii va permit sa obtineti lungimea unui sir, sa eliminati dintr-un sir caracterele de tip spatiu alb, sa convertiti caracterele unui sir n majuscule sau minuscule si altele. - Functia strlen() returneaza lungimea sirului specificat ca argument al functiei. Iata un exemplu simplu de utilizare a functiei strlen(): <?php $s = "Acesta este un sir"; $n = strlen($s); echo "<br /> Lungimea sirului este: $n"; ?> Scriptul de mai sus va afisa: Lungimea sirului este: 18 - Numeroase functii PHP va permit sa eliminati caracterele de tip spatiu alb de la una sau ambele extremitati ale unui sir. Iata un exemplu; care prezinta modul de operare al acestor functii: <?php $s = " Acesta este un sir "; $n = strlen($s); echo "<br /> Lungimea sirului este: $n"; $trim =chop($s); // Elimina spatiile albe din partea dreapta a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; $trim = ltrim($s); // Elimina spatiile albe din partea stanga a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; $trim = rtrim($s); // Elimina spatiile albe din partea dreapta a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n";
$trim = trim($s); // Elimina spatiile albe din ambele parti a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; ?> Scriptul de mai sus va afisa: Lungimea sirului este: 36 Lungimea sirului este: 27 Lungimea sirului este: 27 Lungimea sirului este: 27 Lungimea sirului este: 18 Urmatorul tabel prezinta Functiile PHP de eliminare a caracterelor din siruri: Functii PHP de eliminare a caracterelor din siruri Functie Descriere - Returneaza valoarea lui 's', eliminnd spatiile albe de la chop(s) extremitatea din dreapta a sirului. Similar cu rtrim() - Returneaza valoarea lui 's', eliminnd spatiile albe de la ltrim(s) extremitatea din stnga a sirului - Returneaza valoarea lui 's', eliminnd spatiile albe de la rtrim(s) extremitatea din dreapta a sirului. Similar cu chop() - Returneaza valoarea lui 's', eliminnd spatiile albe de la ambele trim(s) extremitati - Functia strtoupper() returneaza valoarea argumentului, convertita la majuscule. - Functia strtolower{) returneaza valoarea argumentului, convertita la minuscule. - Functia ucfirst{) returneaza valoarea argumentului, cu primul caracter din sir majuscula. Nici una din functii nu modifica valoarea argumentului, valoarea convertita este cea returnata ca rezultat al functiei. Iata un scurt exemplu, care prezinta modul de operare a acestor functii: <?php $s = "abcdefg"; $rezultat = strtoupper($s); $rezultat2 = ucfirst($s); echo "<br />strtoupper('$s'): $rezultat"; echo "<br />ucfirst('$s'): $rezultat2"; $s = "ABCDE"; $rezultat = strtolower($s); echo "<br />strtolower('$s'): $rezultat"; ?> Scriptul de mai sus va afisa: strtoupper(abcdefg): ABCDEFG ucfirst(abcdefg): Abcdefg strtolower(ABCDE): abcde
2. Compararea sirurilor
PHP furnizeaza patru functii care sunt deosebit de utile pentru compararea sirurilor. Aceste functii sunt enumerate n tabelul urmator. Fiecare functie returneaza o valoare al carei semn determina rezultatul comparatiei; nu trebuie sa ncercati sa interpretati valoarea returnata efectiva. Functii PHP de comparatie ntre siruri
Descriere - Executa o comparatie fara sensibilitate la diferenta ntre majuscule si minuscule. Returneaza o valoare mai mica dect zero daca 's1' este mai mic dect 's2', o valoare mai mare dect zero daca 's1' este mai mare dect 's2', respectiv 0 n celelalte cazuri. - Executa o comparatie cu sensibilitate la diferenta ntre majuscule si minuscule. Returneaza o valoare mai mica dect zero daca 's1' este mai mic dect 's2', o valoare mai mare dect zero daca 's1' este mai mare dect 's2', respectiv 0 n celelalte cazuri.
strcmp(s1, s2)
- Executa o comparatie fara sensibilitate la diferenta ntre majuscule si minuscule. La comparatie sunt luate n considerare un numar de 'n' strncasecmp(s1, s2, n) caractere. Returneaza o valoare mai mica dect zero daca 's1' este mai mic dect 's2', o valoare mai mare dect zero daca 's1' este mai mare dect 's2', respectiv 0 n celelalte cazuri. - Executa o comparatie cu sensibilitate la diferenta ntre majuscule si minuscule. La comparatie sunt luate n considerare un numar de 'n' strncmp(s1,s2, n) caractere. Returneaza o valoare mai mica dect zero daca 's1' este mai mic dect 's2', o valoare mai mare dect zero daca 's1' este mai mare dect 's2', respectiv 0 n celelalte cazuri. Iata un scurt exemplu care prezinta modul de utilizare a acestor functii: <?php $s1 = "abcd"; $s2 = "ABCE"; $rezultat = strcasecmp($s1, $s2); echo "<br /> Functia strcasecmp a returnat $rezultat"; $rezultat = strcmp($s1, $s2); echo "<br /> Functia strcmp a returnat $rezultat"; $rezultat = strncasecmp($s1, $s2, 3); echo "<br /> Functia strncasecmp returnat $rezultat"; $rezultat = strncmp($s1, $s2, 3); echo "<br /> Functia strncmp a returnat $rezultat"; ?> Scriptul de mai sus va afisa: Functia 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 dect "ABCE", in schimb, functia strcmp(), la fel ca si functia strncmp(), a identificat sirul "abcd" ca fiind mai mare dect "ABCE". Aceasta s-a ntmplat deoarece literele minuscule au n secventa ASCII o pozitie superioara literelor scrise cu majuscule; litera 'A' are valoarea ASCII 65, iar litera 'a' are valoarea ASCII 97. De asemenea, datele de iesire arata ca functia strncasecmp() a identificat sirul "s1" ca egal cu "s2", deoarece au fost luate in considerare numai primele 3 caractere.
Functie strchr(s1,s2)
Descriere - Returneaza toate sirurile 's1' de la prima aparitie a sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit, functia returneaza FALSE. Functia strstr() executa aceeasi operatie - Returneaza toate sirurile 's1' de la prima aparitie a sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit, functia returneaza FALSE. Sirurile 's1' si 's2' sunt comparate fara a se tine cont daca literele sunt majuscule sau minuscule - Returneaza pozitia (nr. intreg) a primei aparitii a sirului 's2' n 's1'.Daca 's2' nu este gasit, functia returneaza FALSE - Returneaza toate sirurile 's1' de la ultima aparitie a sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit, functia returneaza FALSE. La comparatie este folosit numai primul caracter al sirului 's2' - Returneaza toate sirurile 's1' de la prima aparitie a sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit, functia returneaza FALSE. Functia strchr() executa aceeasi operatie
stristr(s1,s2)
strpos(s1,s2) strrchr(s1,s2)
strstr(s1,s2)
- Returneaza portiunea sirului 's' specificata de indexul ntreg 'start' substr(s, starf) respectiv de indexurile 'start' si 'lung'. Prima pozitie a sirului este pozitia substr(s, start, lung) 0. Iata un exemplu simplu, care prezinta modalitatile de utilizare a mai multor functii de extragere si cautare: <?php $s = "the cat on the mat near the bat"; $b = "at"; $n = strpos($s, $b); echo "<br /> strpos(\"$s\", \"$b\"): $n"; $s = "the cat on the mat near the bat"; $b = "at"; $n = strchr($s, $b); echo "<br /> strchr(\"$s\", \"$b\"): $n"; $s = "the cat on the mat near the bat"; $b = "at"; $n = strrchr($s, $b); echo "<br /> strrchr(\"$s\", \"$b\"): $n"; $s = "the cat on the mat near the bat"; $rezultat = substr($s, 4, 3); echo "<br /> substr(\"$s\", 4, 3): $rezultat"; ?> Studiati cu atentie scriptul si tabelul de mai sus pentru a intelege datele de iesire. Iata si datele de iesire: strpos("the cat on the mat near the bat", "at"): 5 strchr("the cat on the mat near the bat", "at"): at on the mat near the bat strrchr("the cat on the mat near the bat", "at"): at substr("the cat on the mat near the bat", 4, 3): cat O potentiala dificultate n utilizarea functiei strpos() consta n aceea ca poate fi greu de sesizat diferenta dintre valoarea returnata 0, care arata ca sub-sirul a fost gasit n pozitia
initiala a sirului, si valoarea returnata FALSE, care arata ca sub-sirul nu a fost gasit. Iata un scurt exemplu care indica un mod adecvat de testare a valorii returnate de functia strpos(), astfel nct sa se poata face diferenta ntre cele doua rezultate: <?php $poz = strpos($s1, $s2); if ($poz == FALSE) { echo "<br /> sub-sirul nu a fost gasit"; } ?> Procedeul prezentat foloseste operatorul de identitate (==) pentru a determina daca valoarea returnata este identica - nu doar aritmetic egala - cu valoarea FALSE.
str_replace(cauta, nlocuire, subiect) - Se cauta n sirul 'subiect' sub-sirul 'cauta'; daca sub-sirul este gasit, returneaza valoarea 'subiect', nlocuindu-se prima aparitie a sirului 'cauta' cu 'nlocuire'. substr_replace(subiect, nlocuire, start, lungime) - Returneaza valoarea 'subiect', nlocuind sub-siruf care ncepe de la 'start' si avnd lungimea 'lungime' cu sirul 'nlocuire'.
Iata un exemplu care prezinta modul de utilizare a acestor functii: <?php $subiect = "the cat on the mat near the bat"; echo "<br /> Subiect : $subiect"; $cauta = "cat"; $inlocuire = "DOG"; $rezultat = str_replace($cauta, $inlocuire, $subiect); echo "<br /> str_replace : $rezultat"; $inlocuire = "CAT"; $rezultat = substr_replace($subiect, $inlocuire, 4, 3); echo "<br /> substr_replace : $rezultat"; ?> Iata si rezultatul exemplului : Subiect : the cat on the mat near the bat str_replace : the DOG on the mat near the bat substr_replace : the CAT on the mat near the bat
Expresiile regulate (regex) sunt un sir de caractere sablon care descriu multimea cuvintelor posibile care pot fi formate cu acele caractere, respectand anumite reguli. Aceste expresii regulate folosesc paranteze (rotunde, patrate, acolade) prin care formeaza regulile de formare a cuvintelor. Utilitatea cea mai frecventa a unei expresii regulate consta n a recunoaste daca un sir contine sau nu cuvinte sau sub-sir care pot fi formate prin expresia regulata respectiva.
Sa presupunem ca doriti sa specificati un sir care poate include orice vocala. Puteti face aceasta folosind expresia regulata [aeiou]. Prin includerea valorilor posibile ntre paranteze, formati o expresie regulata echivalenta cu formularea "alege oricare din aceste valori". Daca doriti sa permiteti si utilizarea, majusculelor, puteti scrie [aeiouAEIOU]. Sa presupunem ca doriti sa specificati un sir care poate include orice caracter scris cu minuscule. Puteti scrie: [abcdefghijklmnopqrstuvwxyz]. Sau puteti folosi o forma mai compacta [a-z], unde prin cratima se ntelege "o serie de caractere consecutive". Sa presupunem ca doriti sa specificati intr-o expresie regulata sirurile "sat", "mat" si "lat". Pentru aceasta, aveti nevoie de expresia regulata [sml]at. Semnificatia acestei expresii regulate este urmatoarea: "alege oricare din literele 's', 'm' si 'l' si scrie dupa litera respectiva literele 'at'". Daca un accent circumflex (^) este primul simbol mentionat ntre parantezele drepte, acesta are ca efect inversarea semnificatiei expresiei regulate plasate ntre paranteze.
De exemplu, expresia regulata [^a-z] corespunde oricarui caracter care nu este o litera mica.
Pentru a specifica faptul ca o expresie regulata se poate repeta, expresia regulat va fi urmata de o pereche de acolade, care includ limitele superioara si inferioara ale repetitiei.
De exemplu, expresia regulata [aeiou]{1,4} corespunde sirurilor care pot contine intre 1 si 4 vocale.
Pentru a specifica repetarea mai multor parti ale unei expresii regulate, includeti partile respective ntre paranteze rotunde.
De exemplu, expresia regulata ([sml]at){1 ,2} corespunde unui numar de una sau doua repetari ale oricaruia dintre sirurile "sat", "mat" sau "lat".
Pentru a simplifica scrierea de reguli intr-o expresie regulata se folosesc anumite caractere "speciale" Sa presupunem ca doriti sa reprezentati o nmultire intre doua numere, puteti obtine ceva de genul [0-9]*[0-9]. Totusi, aceasta expresie regulata nu are semnificatia dorita, deoarece '*' este un factor de repetitie, nu un caracter dintr-un sir. Pentru a dezactiva semnificatia speciala a caracterului '*', trebuie sa-l prefixati cu un caracter backslash: [0-9]\*[0-9]. Pentru a specifica faptul ca o expresie regulata corespunde numai unui sub-sir care include anumite caractere la inceput, prefixati expresia regulata cu un accent circumflex "^". De exemplu, expresia regulata ^[sml]at corespunde sub-sirurilor "sat", "mat" sau "lat" numai daca acestea apar la nceputul sirului subiect. Similar, pentru a arata ca o expresie regulata corespunde numai unui sub-sir care include anumite caractere la sfarsit, anexati la expresia regulata un simbol al dolarului "$". De exemplu, expresia regulata [sml]at$ corespunde sirurilor "sat", "mat" sau "lat" numai daca acestea apar la sfrsitul sirului subiect. Iata o lista cu mai multe caractere speciale si rolul lor in expresiile regulate:
[] - 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
(.*) - Reprezinta toate caracterele (prin .) repetate de cate ori e posibil (dat de *) <salut> - Cuvantul "salut" (ci|co)tim - Reprezinta "citim" si "cotim" ^The .* hack$ - Sirurile care incep cu "the " si se sfarsesc cu " hack" ^www.[a-z0-9]+.ro$ - Reprezinta sirurile "www.---.ro" unde '---' poate fi orice litera sau cuvant ce contine litere mici si numere (^-\+[0-9]*) - Orice numar care incepe cu "-" sau "+" ^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})$ - Expresie regulata pentru adrese de e-mail
- nlocuieste un sub-sir care corespunde unei expresii regulate (deprecata ereg_replace incepand cu versiunea PHP 5.3 si anulata la PHP 6 - in locul ei poate fi folosita preg_replace) eregi - Executa o identificare cu o expresie regulata insensibila la diferenta ntre majuscule si minuscule (deprecata incepand cu versiunea PHP 5.3 si anulata la PHP 6)
- nlocuieste un sub-sir care corespunde unei expresii regulate insensibile la diferenta ntre majuscule si minuscule (deprecata incepand cu eregi_replace versiunea PHP 5.3 si anulata la PHP 6 - in locul ei poate fi folosita preg_replace) preg_replace - Cauta in sir caracterele sau sablonul care se potriveste cu expresia regulata din functie si o inlocuieste cu alte valori date
split
- Divide un sir ntr-un tablou folosind o expresie regulata (deprecata incepand cu versiunea PHP 5.3 si anulata la PHP 6 - in locul ei poate fi folosita preg_split)
- Creaza o expresie regulata, insensibila la diferenta ntre majuscule si minuscule, dintr-un sir care contine o expresie regulata (deprecata incepand cu versiunea PHP 5.3 si anulata la PHP 6) In continuare este dat un exemplu cu functia ereg(). Forma simpla a functiei ereg() preia doua argumente: un sir care contine o expresie regulata si un sir subiect. Functia returneaza TRUE daca expresia regulata corespunde unui sub-sir al sirului subiect; n caz contrar, returneaza FALSE. sql_regcase - 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 ([az0-9]+) se foloseste /([a-z0-9]+)/. Iata un exemplu cu preg_grep(), aceasta returneaza un array compus din elementele unei matrice care contin sablonul, expresia regulata cautata. Acest exemplu va returna doar acele elementele dintr-o matrice care contin in ele sub-sirurile "casa" sau "masa". <?php $matrice = array('123casa', 'abc masa', '12-xy', '$asa_0/', '123abc casa'); $filtru = preg_grep("/([cm]asa)/", $matrice); print_r ($filtru); // Afiseaza elementele matricei ?> - Variabila "$matrice" contine un Array cu mai multe elemente cu siruri. - In variabila $filtru e preluat rezultatul functiei "preg_grep()" a carei prim parametru este un sablon de expresie regulata (adaugata intre ghilimele duble), iar al doilea este matricea in care e cautat sablonul. - Cu functia "print_r()" se va afisa elementele matricei obtinute in variabila "$filtru". Rezultatul afisat e urmatorul: Array ( [0]=>123casa [1]=>abc masa [4]=>123abc casa )
- Un ultim exemplu util, folosim functia preg_replace() si o expresie regulata pentru a elimina caracterelor speciale dintr-un sir <?php $sir = 'Sir& ce contine*a <caractere: speciale? /in co@nte>xt'; $sir = preg_replace("/([^ A-Za-z0-9_]+)/", "", $sir); echo $sir; ?> In acest exemplu avem un sir (stocat in variabila $sir) ce contine diferite caractere mai putin uzuale. Functia "preg_replace", impreuna cu expresia regulata "/(^ A-Za-z0-9_]+)/", pastreaza in $sir numai literele, cifrele, caracterul '_' si spatiu. Instructiunea "echo" va afisa urmatorul rezultat: Sir ce continea caractere speciale in context
Foreach($_COOKIE as $nume => $valoare) echo "<br /> $nume => $valoare";
- $_COOKIE['numeCookie'] este o variabila super-globala, putand fi accesata si in functii fara a mai specifica "global".
- 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));
'domeniu' va permite sa specificati numele de domeniu asociat unei variabile cookie. n consecinta, variabila cookie va fi disponibila numai pentru siturile Web din cadrul domeniului specificat. De exemplu, sa presupunem ca un script din serverul Web http://www.subdomeniu.domeniu.com creeaza o variabila cookie. n mod prestabilit, variabila cookie este disponibila numai pentru gazda respectiva. Cu toate acestea, puteti face variabila cookie disponibila pe ntreg domeniul 'subdomeniu.domeniu.com', specificnd "subdomeniu.domeniu.com" ca valoare a argumentului 'domeniu'. - Argumentul 'secure' este o valoare ntreaga, care specifica daca variabila cookie trebuie trimisa prin intermediul unei conexiuni sigure (HTTPS). Specificati valoarea l pentru a mpiedica transmiterea variabilei cookie n cazul n care conexiunea nu este sigura; pentru a permite transmiterea variabilei cookie prin conexiuni HTTP obisnuite, specificati valoarea 0.
contrar, returneaza FALSE - Returneaza TRUE daca fisierul specificat exista si se poate scrie n acel is_writable() fisier; n caz contrar, returneaza FALSE Functiile fileowner() si filegroup() returneaza fiecare un identificator numeric; puteti converti identificatorul numeric ntr-un sir prin invocarea functiei posix_getpwuid() cu un identificator de utilizator, respectiv a functiei posix_getgrgid() cu un identificat de grup. Acestea returneaza informatii despre identificatorul precizat. Iata un exemplu in care puteti vedea, si intelege mai bine, cum sunt folosite functiile rezentate in tabelul anterior (fisierul 'test.txt' care va fi folosit de functii se afla in acelasi director cu scriptul php): <?php $filename = "test.txt"; $result = file_exists($filename); echo "<br /> file_exists(): $result"; $result = fileowner($filename); echo "<br /> fileowner(): $result"; $result = filegroup($filename); echo "<br /> filegroup(): $result"; $result = filetype($filename); echo "<br /> filetype(): $result"; $result = filesize($filename); echo "<br /> filesize(): $result"; $result = fileatime($filename); $result = date("m/d/Y H:i", $result); echo "<br /> fileatime(): $result"; $result = filectime($filename); $result = date("m/d/Y H:i", $result); echo "<br /> filectime(): $result"; $result = filemtime($filename); $result = date("m/d/Y H:i", $result); echo "<br /> filemtime(): $result"; $result = fileperms($filename); $result = decoct($result); echo "<br /> fileperms(): $result"; $result = is_file($filename); echo "<br /> is_file(): $result"; $result = is_dir($filename); echo "<br /> is_dir(): $result"; $result = is_readable($filename); echo "<br /> is_readable(): $result";
$result = is_writable($filename); echo "<br /> is_writable(): $result"; ?> Datele de iesire ale exemplului sunt urmatoarele file_exists(): 1 fileowner(): 0 filegroup(): 0 filetype(): file filesize(): 5 fileatime(): 08/28/2008 00:00 filectime(): 08/28/2008 10:49 filemtime(): 08/28/2008 11:32 fileperms(): 100666 is_file(): 1 is_dir(): is_readable(): 1 is_writable(): 1 - O lista cu mai multe functii utile in lucrul cu fisiere gasiti la pagina -> Functii pentru fisiere si directoare.
2. Privilegii de fisier
Privilegiile asociate unui fisier (sau director) determina operatiile pe care utilizatorii le pot efectua cu fisierul (sau directorul) respectiv. = Privilegiile sunt date sub forma a trei grupuri alcatuite din cte trei caractere fiecare; cu alte cuvinte, trei triade. Prima triada indica privilegiile acordate posesorului fisierului. Cea de-a doua triada indica privilegiile acordate membrilor grupului posesor al fisierului. Cea de-a treia triada indica privilegiile acordate altor utilizatori. Cele 3 caractere care alcatuiesc un grup sunt reprezentate, in sistemele UNIX, prin urmatoarele tri litere: 'r', 'w' si 'x'; acestea reprezinta:
r - fisierul poate fi citit w - se poate scrie n fisier x - continutul fisierului poate fi executat
Caracterele unei triade apar ntotdeauna n secventa 'rwx'. Daca o anumita litera este nlocuita de o cratima (-), privilegiul asociat nu este accesibil. De exemplu, sa examinam privilegiile specificate in urmatorul exemplu: rwxr-xr-"rwx", posesorul fisierului poate citi, scrie sau executa fisierul "r-x", membrii grupului posesor al fisierului pot citi sau executa fisierul, dar nu pot scrie n fisier "r--", alti utilizatori pot citi fisierul, dar nu pot scrie n fisier sau executa continutul fisierului Aceste caractere au urmatoarea semnificatie:
Privilegiul 'x' este semnificativ numai pentru fisierele care includ un continut executabil, cum sunt fisierele binare executabile (.exe) sau anumite categorii de scripturi. Posesorul unui fisier poate modifica privilegiile asociate fisierului emitnd comanda chmod (aceasta functioneaza in sistemele de operare UNIX). Aceasta comanda are doua forme. O forma va permite sa specificati privilegiile folosind cifre scrise n octal; cealalta va permite sa le specificati folosind litere.
Pentru a specifica privilegiile folosind cifre n octal, calculati valoarea numerica a fiecarei triade. Pentru aceasta, nsumati numerele corespunzatoare fiecarui privilegiu disponibil din cadrul triadei. Numerele asociate privilegiilor sunt urmatoarele:
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.
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. Cnd deschideti un fisier binar sub Windows, specificati "b" ca al doilea caracter al modului; de exemplu, "rb" pentru citire, "wb" pentru scriere, "a+b" pentru citire si adaugare. Daca nu procedati astfel, citirile din fisier si alte operatii se vor ncheia prematur sau vor esua.
Functia fclose() returneaza valoarea TRUE daca fisierul a fost nchis cu succes. Testarea acestei valori este rareori necesara, deoarece nu se mai pot face prea multe dupa ce s-a ratat o ncercare de a nchide un fisier.
} fclose($fh); ?> - Instructiunea "while" asigura faptul ca functia fgets() este apelata n mod repetat, pna la citirea tuturor liniilor. O alta modalitate simpla de a citi linie cu linie un ntreg fisier consta n a folosi functia file(). Aceasta functie returneaza un tablou n care fiecare element contine o linie a fisierului specificat. Iata un exemplu care foloseste functia file() pentru a citi si pentru a afisa continutul unui fisier: <?php $tablou = file("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.
Dupa ce a afisat fisierul, functia l nchide automat. - Cealalta functie, readfile(), necesita numai numele sau calea fisierului: readfile("carte.txt");
echo "<br /> Citeste : $s"; } // Deruleaza la inceputul fisierului si reia redarea acestuia rewind($fh); while (!feof($fh)) { $s = fgets($fh, 256); echo "<br /> Citeste \$s : $s"; } fclose($fh); ?> Daca se produce vreo eroare, functia rewind() returneaza zero. Desi functia rewind() este utila n caz de nevoie, necesitatea de a readuce un pointer de fisier la nceputul fisierului nu este chiar att de frecventa. Functia fseek() furnizeaza o mai mare flexibilitate, permitndu-va sa pozitionari pointerul de fisier astfel nct sa puteti citi sau scrie n orice punct al fisierului. Functia are doua forme, cea mai simpla fiind urmatoarea: fseek(identificator_fisier, offset) unde 'identificator_fisier' este identificatorul de fisier returnat de functia fopen(), iar 'offset' este pozitia dorita a pointerului de fisier, specificata n octeti, n raport cu nceputul fisierului. In caz de reusita, functia fseek() returneaza 0; n caz contrar, returneaza -l . O forma alternativa a functiei asigura un grad superior de flexibilitate, avand urmatoarea forma: fseek(identificator_fisier, offset, baza) unde 'identificator_fisier' si 'offset' au semnificatiile definite anterior, iar 'baza' ia una ; dintre urmatoarele valori: SEEK_SET, care stabileste pozitia pointerului de fisier n raport cu nceputul fisierului SEEK_CUR, care stabileste pozitia pointerului de fisier n raport cu valoarea curenta a pointerului SEEK_END, care stabileste pozitia pointerului de fisier relativ la sfrsitul fisierului
Valoarea argumentului 'offset' poate fi pozitiva, negativa sau zero. De exemplu, pentru a pozitiona pointerul cu 1000 de octeti nainte de sfrsitul fisierului, emiteti urmatorul apel de functie: fseek($fh, -1000, SEEK_END) Pentru a obtine valoarea curenta a pointerului de fisier, folositi functia ftell(), care are urmatoarea forma: ftell(identificator_fisier) Functia returneaza valoarea curenta a identificatorului de fisier, respectiv valoarea zero daca functia esueaza.
$fh = @fopen($nume, "ab"); if (!$fh) { echo "Nu a fost deschis fisierul carte.txt."; } else { $ok = fwrite($fh, "Acestea sunt datele adaugate \n"); echo "<br /> Rezultatul scris este: $ok"; fclose($fh); } ?> Acest script va avea urmatoarele date de iesire: Rezultatul scris este: 30 - Programul prezentat n exemplul anterior scrie n fisierul "carte.txt" o linie de text. Deoarece fisierul a fost deschis folosind modul "a", datele sunt atasate la fisier; cu alte cuvinte, datele sunt scrise la sfarsit, dupa toate datele existente n fisier. Observati ca a fost scris si un caracter de terminare a liniei ("\n"), astfel nct fisierul sa poata fi citit linie cu linie la un moment de timp ulterior. Daca lucrati cu un fisier text, n general e util sa includeti un caracter de terminare a liniei la sfrsitul fiecarei linii scrise n fisier. Programul din exemplu scrie n fisier o singura linie de text. Totusi, puteti scrie mai multe linii, daca doriti. Daca apelati functia fwrite() din interiorul unei bucle, aveti posibilitatea de a scrie mai multe linii. Dupa ce ati scris toate liniile de care aveti nevoie, nchideti fisierul prin apelarea functiei fclose(). PHP mai furnizeaza si o forma alternativa a functiei fwrite(): fwrite(identificator_fisier, date, lungime); Aceasta forma include un al treilea argument, si anume "lungime", care va permite sa specificati numarul maxim de octeti care vor fi scrisi. Argumentul "lungime" al functiei fwrite() trebuie utilizat atunci cnd se scrie n fisiere binare sub Microsoft Windows. Windows prefera secventa de terminare a liniei "\r\n". Atunci cnd scrieti programe PHP pentru sisteme Windows, este de preferat sa folositi secventa "\r\n" de terminare a liniei. - PHP dispune de o alta functie pentru scrierea fisierelor, fputs(). Totusi, n afara de nume, fputs() este similara cu functia fwrite().
1. basename(adresa, "sufix") - Returneaza partea cu numele fisierului dintr-o adresa URL. "sufix" e optional, daca e specificat, functia elimina si pe acesta de la sfarsitul numelui. <?php $url = 'http://www.marplo.net/php-mysql/index.php'; $file = basename($url); // $file e "index.php" $file = basename($url, ".php"); // $file e "index" ?> 2. chmod(file, mod)
- Modifica prmisunile CHMOD a lui "file" (cale si nume fiser) cu cele specificate la "mod" (0777, 0644, ...). Daca modificarea reuseste returneaza TRUE, in caz contrar, FALSE. <?php chmod("director/fisier.ext", 0755); ?> 3. copy(sursa, destinatie) - Copie fisierul specifical la "sursa", in locatia "destinatie" (aici poate fi specificata si denumirea fisierului la dstinatie). Aca fisierul deja exista, va fi inlocuit de cel copiat. Funtctia returneaza TRUE in caz de reusita sau FALSE. "> <?php $file = 'examplu.txt'; $newfile = 'dir/examplu.txt.bak'; if (!copy($file, $newfile)) { echo "Fisierul$file nu a putut fi copiat \r\n"; } ?> 4. dirname(adresa) - Returneaza numele directorului din "adresa", fara numele fisierului sau alte extensii. <?php $url = 'marplo.net/php-mysql/index.php'; $dir = dirname($url); echo $dir; ?> // marplo.net/php-mysql
5. disk_free_space(cale_dir) - Returneaza spatiul liber al sistemului in directorul specificat la "cale_dir". Returneaza numarul de bytes liberi sau FALSE daca functia esueaza. <?php $dir = '/'; // Directorul radacina echo disk_free_space($dir); // 123456789 ?> 6. disk_total_space(cale_dir) - Returneaza spatiul total al sistemului in directorul specificat la "cale_dir". Returneaza numarul total de bytes sau FALSE daca functia esueaza. 7. fopen("fisier", "mod") - Deschide un pointer la "fisier", in modul de lucru "mod". "mod" poate fi ("b" e indicat sa fie adaugat pentru sistemele windows):
r sau rb - pentru citire. r+ sau r+b - citire si scriere. w sau wb - creare si scriere fisier de la 0. w+ sau w+b - citire si scriere fisier de la 0, il creaza daca nu exista.
a sau ab - scriere, adauga datele dupa cele deja existente. Creaza fisierul daca nu exista. a+ sau a+b - citire si scriere, adauga datele dupa cele deja existente. Creaza fisierul daca nu exista x sau xb - creare si scriere, daca fisierul exista deja, returneaza eroare. x sau x+b - creare pentru citire si scriere, daca fisierul exista deja, returneaza eroare.
<?php $file = 'tutoriale.php'; $fo = fopen($file, "a+b"); // Deschide fisierul, in modul de citire si adaugare date fclose($fo); // Inchide pointer-ul, elibereaza memoria folosita ?> 8. fclose(file_pointer) - Inchide deschiderea unui fisier cu "fopen()" (transmisa la "file_pointer"), eliberand memoria folosita de acea deschidere. Returneaza TRUE daca functia reuseste, in caz contrar, FALSE. <?php $file = 'tutoriale.php'; $fo = fopen($file, "rb"); // Deschide fisierul, in modul de citire ("rb") si creaza pointer-ul fisierului fclose($fo); // Inchide pointer-ul, elibereaza memoria folosita ?> 9. feof(file_pointer) - Testeaza sfarsitul unnui fisier cu deschiderea specificata la "file_pointer". Functie utila cand fisierul e citit linie cu linie. Returneaza TRUE daca pointer-ul e la sfarsitul fisierului, altfel, returneaza FALSE. <?php $file = 'tutoriale.php'; $fo = fopen($file, "rb");
// Parcurge fisierul pana ajunge la sfarsit (atunci "feof" e TRUE - adica "!feof" e FALSE) while(!feof) { } fclose($fo); ?> // Inchide pointer-ul, elibereaza memoria folosita
10. fgets("pointer", lungime") - Citeste numarul de caractere specificat la "lungime" dintr-un fisier deschis si specificat la "pointer". Citirea se face din locul unde a ajuns pointer-ul in fisier, daca "lungime" nu e specificat citirea se va face pana la sfarsitul randului curent (daca lungimea liniei e mai mare de 8 KB, e indicata specificarea ei). <?php $file = 'cursuri.php'; $fo = fopen($file, "rb"); $text = fgets($fo, 250); fclose($fo); ?>
// Deschide fisierul, in modul de citire ("rb") // Citeste 250 caractere din primul rand al fisierului
11. file_exists("fisier") - Returneaza TRUE daca "fisier" exista, altfel, returneaza FALSE. <?php if (file_exist('dir/file.ext')) echo 'Fisierul exista'; else echo 'Fisierul nu exista'; ?> 12. file_get_contents("fisier") - Returneaza tot continutul din "fisier" intr-un sir. Daca "fisier" nu poate fi citit, returneaza FALSE. 13. file_put_contents("fisier", "continut") - Scrie in "fisier" sirul specificat la "continut". Daca fisierul exista, suprascrie datele existente, daca nu exista, il creaza. Daca nu poate scrie in "fisier", returneaza FALSE. <?php $file = 'cursuri.php'; $context = file_get_contents($file); // Preia continutul fisierului $context .= 'Sir nou adaugat dupa cel existent'; file_put_contents($file, $context); ?> 14. file("fisier", flag) - Preia continutul fisierului intr-un array, fiecare linie din "fisier" va fi un element din matrice. "flag" e optional, in locul lui se poate adauga: FILE_IGNORE_NEW_LINES (nu va prelua si caracterele de linie noua), FILE_SKIP_EMPTY_LINES (va sari peste randurile goale). <?php $aray_file = file('tutorials.php'); // Sau $aray_file = file('tutorials.php', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // Afiseaza primul rand echo $aray_file[0]; ?> 15. fileatime("file") - Returneaza timestamp-ul (timpul UNIX) cand a fost accesat ultima data "file", sau in caz de nereusita, FALSE. <?php $file = 'somefile.txt'; if (file_exists($file)) { echo "$file a fost accesat in data: " . date("F d Y H:i:s", fileatime($file)); } // Afiseaza ceva de genul: ?> somefile.txt a fost accesat in data: April 14 2010 22:16:23 // Adauga continutul din $context in $file
16. filectime("file") - Returneaza timestamp-ul (timpul UNIX) cand a fost modificat ultima data "file", sau in caz de nereusita, FALSE. Similara cu aceasta e functia filemtime() 17. fileperms("file") - Returneaza permisiunile CHMOD ale "file", sau FALSE. 18. filesize("file") - Returneaza marimea lui "file", in bytes, sau FALSE. 19. flock(file_pointer, flag) - Blocheaza / deblocheaza accesul de citire sau scriere la un fisier deschis cu "fopen()", specificat la "file_pointer". Returneaza TRUE, sau daca functia esueaza, FALSE. Modul de blocare, sau deblocarea, se specifica la "flag", acesta putand fi:
LOCK_SH - blocare acces citire. LOCK_EX - blocare acces scriere. LOCK_UN - deblocare
<?php $fo = fopen("fisier.txt", "r+"); if (flock($fo, LOCK_EX)) { // blocheaza alt acces la fisier pt scriere fwrite($fo, "Scrie ceva in el."); flock($fo, LOCK_UN); // Elibereaza blocarea } else { echo "Nu poate bloca fisierul!"; } fclose($fo); ?> 20. fseek(file_pointer, pozitie) - Muta pozitia pointer-ului dintr-un fisier deschis cu "fopen()" la numarul de caractere specificat de "pozitie" (0 e primul caracter). In caz de succes returneaza 0, altfel, -1. <?php $fo = fopen('somefile.txt', 'r+b'); fseek($fo, 199); // Muta pointerul in fisier la al 200-lea caracter ?> 21. ftell(file_pointer) - Returneaza pozitia curenta a indicatorului (pointer) dintr-un fisier deschis cu "fopen()" (specificat la "file_pointer"). In caz de esec returneaza FALSE. <?php // Deschide un fisier si citeste cateva caractere $fo = fopen("dir/file.txt", "rb"); $data = fgets($fo, 12);
// Afiseaza locatia unde e acum pointer-ul in fisier echo ftell($fo); // 11 fclose($fo); ?> 22. fwrite(file_pointer, 'sir') - Scrie intr-un fisier deschis cu "fopen()" (specificat la "file_pointer") continutul din "sir". <?php // Daca poate deschide fisierul pt. adaugare date if ($fo = fopen('tutorial.txt', "a+b")) { $add = 'Textul ce va fi adaugat'; // Daca nu poate adauga datele, returneaza eroare // Altfel, confirmare if (fwrite($fo, $add) === FALSE) echo 'Eroare, textul nu a putut fi adaugat'; else echo 'Datele au fost scrise'; fclose($fo); } ?> 23. is_dir("nume") - Returneaza TRUE daca "nume" exista si este un director, altfel returneaza FALSE. <?php if (is_dir('php')) echo 'php este un director in cel curent'; ?> 24. is_file("nume") - Returneaza TRUE daca "nume" exista si este un fisier, altfel returneaza FALSE. <?php if (is_file('php/tutoriale.php')) echo 'tutoriale.php este un fisier in directorul "php" din cel curent'; ?> 25. is_readable("nume") - Returneaza TRUE daca "nume" (fisier sau director) exista si poate fi citit, altfel returneaza FALSE. <?php // Daca fisierul poate fi citit, il citeste si afiseaza continutul if (is_readable('php/tutoriale.php')) readfile('php/tutoriale.php'); ?> 26. is_uploaded_file("fisier_up") - Returneaza TRUE daca "fisier_up" a fost incarcat pe server, prin upload si primit prin $_POST, altfel returneaza FALSE. Parametrul functiei trebuie sa fie de forma "$_FILES['userfile']['tmp_name']".
<?php // Daca fisierul poate fi citit, il citeste si afiseaza continutul if (is_uploaded_file($_FILES['userfile']['tmp_name'])) echo 'Fisierul a fost incarcat'; else echo 'Fisierul nu a putut fi incarcat'; ?> 27. is_writable("nume") - Returneaza TRUE daca "nume" (fisier sau director) exista si poate sa scrie in el, altfel returneaza FALSE. <?php if (is_writable('php/tutoriale.php')) echo 'tutoriale.php poate fi scris'; ?> 28. mkdir("dir", chmod) - Returneaza TRUE daca a putut crea directorul "dir" cu permisiunile specificate la "chmod", altfel returneaza FALSE. <?php if (mkdir('php')) echo 'Directorul a fost creat'; ?> 29. pathinfo("adresa_file") - Returneaza o matrice cu informatiile: ale "adresa_file". <?php $path_parts = pathinfo('/www/htdocs/index.php'); echo $path_parts['dirname']; echo $path_parts['basename']; echo $path_parts['extension']; echo $path_parts['filename']; ?> 30. readfile("fisier") - Citeste si returneaza la browser (afiseaza) continutul din "fisier". In caz de esec returneaza FALSE. 31. realpath("cale_adresa") - Returneaza calea reala in sistem a unei adrese din "cale_adresa", rezolvand referinte ca .. / ./ ../. <?php echo realpath('./../../etc/passwd'); // /etc/passwd echo realpath('/windows/system32'); // C:\WINDOWS\System32 echo realpath(__FILE__); // Va returna calea absoluta pe server a fisierului curent ?> 32. rename("nume", "nume_nou" - Redenumeste un director sau fisier specificat la "nume", cu "nume_nou". In caz de succes returneaza TRUE, altfel FALSE. // /www/htdocs // index.php // php // index (incepand cu PHP 5.2.0)
<?php rename("dir/file.txt", "dir/my_file.txt"); ?> 33. rewind(file_pointer) - Readuce pozitia pointer-ului dintr-un fisier deschis cu "fopen()" (specificat la "file_pointer") la inceputul fisierului (0, primul caracter). In caz de succes returneaza TRUE, altfel FALSE. <?php // Deschide un fisier si citeste cateva caractere $fo = fopen("tutorial.txt", "rb"); $data = fgets($fo, 12); // Afiseaza locatia unde e acum pointer-ul in fisier echo ftell($fo); // 11 rewind($fo); // Readuce pointer-ul la inceput
// Afiseaza iar locatia indicatorului echo ftell($fo); // 0 fclose($fo); ?> 34. rmdir("dir") - Sterge directorul specificat la "dir". Acesta trebuie sa fie gol. In caz de succes returneaza TRUE, altfel FALSE. 35. tempnam("dir", "prefix") - Creaza un fisier cu nume unic, avand la inceput in nume sirul specificat la "prefix", in directorul "dir". Ii acorda CHMOD 0600. Daca directorul specificat nu exista, creaza fisierul in directorul "temp" al sistemului si returneaza numele fisierului. In caz de nereusita returneaza FALSE. 36. tmpfile() - Creaza un fisier temporar, cu nume unic. Returneaza un pointer de fisier, ca si "fopen()", cu modul de deschidere "w+". In caz de nereusita returneaza FALSE. Cu "fclose()" fisierul temporar va fi sters. <?php $temp = tmpfile(); // Creaza fisierul temporar fwrite($temp, "Text scris in fisierul temporar creat"); // Scrie ceva in el rewind($temp); // Readuce pointerul la inceputul fisierului echo fread($temp, 1024); // Citeste si afiseaza primii 1024 bytes fclose($temp); // Inchide si sterge fisierul temporar creat ?> 37. unlink("fisier") - Sterge fisierul specificat. In caz de succes returneaza TRUE, altfel FALSE.
<?php if (unlink("test.txt")) echo 'Fisierul a fost sters.'; else echo "Stergerea fisierului nu a reusit."; ?>
LOCK_SH - Blocare partajata in scopuri de citire LOCK_EX - Blocare exclusiva in scopuri de scriere LOCK_NB - Blocare fara fixare LOCK_UN - Eliminarea blocarii
Iata cum se foloseste procesul de blocare, vom folosi acelasi exemplu, contoarul de mai sus, de data aceasta imbunatatit. <?php $contor = "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 nct accesul simultan sa nu cauzeze o numarare eronata. Blocare se face imediat dupa ce a fost deschis fisierul, cu "LOCK_EX", si se incheie imediat dupa rescrierea in fisier, prin deblocare acestuia "LOCK_UN".
Unde "nume_vechi" este numele si calea originala a fisierului, iar "nume_nou" este numele dorit. Functia returneaza TRUE daca operatia de modificare a numelui a reusit; n caz contrar, returneaza FALSE. Iata un exemplu de utilizare a functiei rename(): <?php $ok = rename("test.txt", "teste.dat"); if (!$ok) { echo "Modificarea numelui nu a reusit."; } ?> - Exemplu modifica numele fisierului "test.txt" in "teste.dat".
<input type="file" name="fisier" /> <br /> <input type="submit" name='submit' value="Trimite" /> </form> - Cnd utilizatorul apasa pe butonul de "Trimite", scriptul PHP preia datele si va incarca fisierul dorit in server
1. dirname - rezultatul invocarii functiei dirname() avnd ca argument calea respectiva 2. basename - rezultatul invocarii functiei basename() avnd ca argument calea respectiva 3. extension - extensia fisierului (daca exista) dat de rezultatului functiei basename() 4. filename - numele fisierului dat de rezultatului functiei basename(), dar fara extensie
Iata un exemplu care prezinta modul de utilizare a functiei pathlnfo() : <?php $path_parts = pathinfo('plomar/curs-php/lectii/lectia1.php'); foreach ($path_parts as $num => $val) { echo "<br /> $num => $val"; } ?> Datele de iesire ale scriptului de mai sunt urmatoarele : dirname => plomar/curs-php/lectii basename => lectia1.php extension => php filename => lectia1 Un alt mod in care puteti utiliza si afla valorile returnate de functi pathinfo() este urmatorul: <?php $path_parts = pathinfo('plomar/curs-php/lectii/lectia1.php'); echo "<br />". $path_parts['dirname'], "\r\n"; echo "<br />". $path_parts['basename'], "\r\n"; echo "<br />". $path_parts['extension'], "\r\n"; echo "<br />". $path_parts['filename'], "\r\n"; ?> Acest exemplu va returna urmatoarele date de iesire : plomar/curs-php/lectii lectia1.php php lectia1
1. opendir() - deschide directorul pentru citire 2. readdir () - citeste o intrare dintr-un catalog 3. closedir() - nchide catalogul, elibernd resursele alocate de functia opendir()
Rezultatul apelarii functiei readdir() este un sir care contine numele urmatorului fisier sau sub-director din catalogul deschis. Functia returneaza FALSE atunci cnd au fost citite toate intrarile din catalog. Iata un exemplu care prezinta modul de utilizare a acestor functii pentru citirea continutului unui catalog: <?php $dc = @opendir("home/plomar/curs-php"); if (!$dc) { echo "Directorul nu a putut fi deschis"; } else { while ($ok = readdir($dc)) { echo "<br /> $ok"; } closedir($dc); } ?> Datele de iesire ale exemplului pot fi similare cu cele prezentate mai jos : style imgs lectia scripts 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.
Unde "nume_vechi" este numele si calea originala a directorului, iar "nume_nou" este numele nou dorit.
Initializarea unei sesiuni se face cu functia : Aceasta trebuie sa fie printre primele linii de cod dintr-un script PHP, deoarece apelul acestei functii trebuie facut inainte de trimiterii catre browser-ul Web a vreunui cod HTML sau chiar a unui spatiu vid. Daca folosim stocarea iesirii in buffer, instructiunea session_start() nu trebuie inserata neaparat la inceputul codului. Instructiunea session_start() nu este necesare daca in fisierul de configurare "php.ini", variabila "session.auto_start" are valoarea TRUE. Pentru a intelege mai bine modul de lucru cu sesiuni si functia session_start(), folosim un exemplu in care avem o pagina principala "a.php" unde cream o variabila cu numele "userName", atribuindu-i valoarea "MarPlo", pe care o stocam intr-o sesiune PHP, pagina contine o legatura catre o alta pagina "b.php", aceasta din urma va folosi functia session_start() pentru a prelua, prin sesiune, valoarea variabilei "user_name" din pagina "a.php", astfel putem folosi valoarea acestei variabile intr-un script din pagina "b.php". Continutul fisierului "a.php" este urmatorul: <?php //Fisierul a.php session_start(); if(!isset($_SESSION['userName']))
$_SESSION['userName'] = "MarPlo"; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> Aceasta este pagina "a.php" <?php echo "<br />Variabila de sesiune are valoarea: ". $_SESSION['userName']; ?> <br />Legatura <a href="b.php">spre pagina b.php</a> </body> </html> Continutul fisierului "b.php" este urmatorul: <?php //Fisierul b.php session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Pagina b.php</title> </head> <body> Aceasta este pagina b.php <?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".
<?php echo "<br /> Identificatorul sesiunii curente SID este:". session_id(); //Va afisa un rezultat asemanator cu: "Identificatorul sesiunii curente SID este:2846240682abf24a09f42664fc03bbf3" ?> Functia session_id() accepta un parametru. Astfel putem seta un anumit SID pentru sesiunea curenta. In acest caz trebuie sa apelam functia session_id() inainte de functia : session_start(), ca in exemplul urmator: <?php session_id('123abc'); session_start(); echo "<br /> Identificatorul sesiunii curente SID = ". session_id(); //Va afisa rezultatul: "Identificatorul sesiunii curente SID = 123abc" ?> Deoarece variabilele de sesiune pot fi citite de alti utilizatori neautorizati, nu este indicat sa pastram aici informatii esentiale cum sint parolele. Pentru a creea un minimum de securitate putem codifica aceste informatii, folosind functtile de codare oferite de PHP:
- Functia md5(sir_de_caractere) codifica sirul de caractere furnizat ca parametru si returneaza un sir de 32 charactere hexazecimale. Aceasta functie foloseste algoritmul de criptare: "RSA Data Security, Inc. MD5 Message-Digest Algorithm". Iata un exemplu de utilizare al acestei codificari: <?php $user = "MarPlo"; $codificat = md5($user); echo "<br /> user codificat = $codificat"; // Va afisa: "user codificat = 0a460e3d95526f05a0064154ad94a378" ?> Consideram cazul in care avem o variabila de sesiune "$parola" care pastreaza o parola si dorim sa codificam si sa transmitem acrasta variabila astfel incat utilizatorii neautorizati sa nu o poata folosi. Pentru aceasta folosim functia md5(), pentru a o cripta. Mai mult initializam o variabila globala cu numele "$secret", careia ii atribuim ca valoare un sir de caractere oarecare. In continuare, inainte de a introduce parola intr-o sesiune PHP, concatenam valorile "$secret" si "$parola" si criptam rezultatul. Astfel, chiar daca cineva reuseste sa decripteze variabila de sesiune, este putin probabil sa poata separa sirul "$secret" creat de noi. Este bine sa pastram acest fisier intr-un director pretejat, cum ar fi cu un nivel mai sus decat directorul pentru pagini de Web. Iata cum se prezinta exemplul prezentat mai sus. (consideram o variabila "$passtest" care verifica daca valoarea acesteia este egala cu parola): <?php $secret = 'abcgfd43599oopjhfdxcaqq30pmnvcx'; $parola = 'mypass'; $cod = md5($secret. $parola); session_start(); $_SESSION['parola'] = $cod;
// Consideram variabila "$passtest" pentru a testa daca valoarea acesteia este egala cu parola if (md5($secret. $passtest) == $_SESSION['parola']) echo "Parola acceptata"; else echo "Parola nu este valida"; ?> Astfel, daca valoarea variabilei "$passtest", care poate fi obtinuta de exemplu dintr-un formular HTML, este identica cu parola pastrata de noi, va fi afisat mesajul "Parola acceptata".
Acesta lectie explica bazele de date relationale si modul de utilizare a acestora. Spre deosebire de fisiere, bazele de date prezinta multe avantaje, inclusiv o mai mare protectie a integritatii datelor si asigurarea partajarii datelor. In aceasta lectie va fi prezentat SQL, limbajul standard pentru crearea, accesul si manipularea bazelor de date relationale. Detaliile (cu precadere sintaxa SQL sunt cele referitoare la MySQL, cel mai popular limbaj de baze de date folosit cu PHP.
In continuare puteti vedea un tabel caracteristic dintr-o baza de date relationala care prezinta personalitati istorice ale Americii. PersoanaID Nume AnNastere 001 George Washington 1732 002 John Adams 1735 003 Thomas Jefferson 1743 Primul rnd al tabelului atribuie nume pentru fiecare coloana. Fiecare rnd al tabelului, altul dect primul rnd, descrie o singura personalitate. De exemplu, al doilea rnd descrie o personalitati pe nume George Washington. Fiecare coloana, descrie un anumit atribut al personalitatii De exemplu, a doua coloana contine numele personalitatilor, iar a treia coloana contine anii n care s-au nascut acestia. Pentru a se putea face referire, mai usor, la un anumit rnd al tabelului, se obisnuieste ca fiecare tabel sa contina o coloana care identifica n mod unic fiecare rnd. Aceasta coloana se numeste "cheia primara" a tabelului. In exemplul prezentat, coloana numita "PersoanaID" serveste drept cheie primara. Daca nici o coloana nu contine o valoare unica pentru fiecare rnd, se pot combina valorile mai multor coloane pentru a crea o "cheie primara compusa". O baza de date relationala se numeste astfel datorita capacitatii sale de a stabili relatii ntre date din mai multe tabele. Urmatorul exemplu prezinta doua tabele si o relatie ntre acestea. PersoanaID Nume AnNastere Meserie PersoanaID 001 George Washington 1732 Arhitect 003 002 John Adams 1735 General 001 003 Thomas Jefferson 1743 Filozof 002 Al doilea tabel contine informatii despre meseriile caracteristice ale persoanelor prezentate in exemplul anterior. Mai precis, tabelul identifica persoana cu o anumita meserie. Numele meseriei serveste drept cheie primara a tabelului, care mai contine, n afara de aceasta, o singura coloana. Coloana respectiva stocheaza atributul "PersoanaID" din primul tabel, al persoanei care cunoaste meseria descrisa de un anumit rnd. De exemplu, angajatul cu numarul 003 este arhitect. Retineti ca "PersoanaID" este att cheia primara a tabelului original, dar si o coloana din noul tabel. Coloana "PersoanaID" a noului tabel se numeste "cheie externa"; desi nu este cheia primara a noului tabel, este cheia primara a unui alt tabel. Aplicatia software care gazduieste o baza de date se numeste "sistem de gestiune a bazelor de date" (SGBD). Exista multe sisteme de gestiune a bazelor de date, printre cele mai populare asemenea sisteme se numara: DB2 , Interbase , MySQL , Oracle , Postgresql , SQL Server , Sybase . MySQL este cel mai popular sistem de gestiune a bazelor de date destinat utilizarii cu PHP, n mare masura deoarece este gratuit. Totusi, prin intermediul PHP este posibil accesul la aproape orice SGBD modern. Bazele de date relationale nteleg SQL (Structured Query Language), un limbaj relativ simplu, folosit pentru solicitarea datelor. In ciuda simplitatii sale, SQL este un limbaj foarte puternic, care poate obtine accesul la date stocate n mai multe tabele, poate filtra datele dorite si poate sorta, rezuma si afisa rezultatele. n general, bazele de date relationale si stocheaza datele ntr-un singur fisier sau catalog. Aceasta caracteristica de organizare faciliteaza administrarea datelor, deoarece executarea copiei de siguranta, respectiv restaurarea unui singur fisier sau catalog se realizeaza mai usor.
Sistemele de gestiune a bazelor de date relationale necesita mai multe cicluri de procesor pentru a satisface o cerere de date dect cele necesare pentru accesul la un fisier normal, dar ofera protectie sporita a datelor, iar pentru accesul la distanta usureaza traficul deoarece majoritatea operatiilor sunt efectuate de programul SQL, astfel singurele date transmise in retea ar fi rezultatul cerut.
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 dect 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, avnd 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, avnd o latime de FLOAT(m,d) afisare egala cu "m" si un numar de "d" cifre dupa virgula - Un ntreg pe 32 de biti. Daca se specifica atributul UNSIGNED, INTEGER domeniul de valori este cuprins ntre 0 si 4294967295; n caz contrar, INTEGER UNSIGNED domeniul este cuprins ntre valorile -2147483648 si 2147483647 NUMERIC - Similar cu DECIMAL NUMERIC (m, d) REAL - Similar cu DOUBLE REAL(m, d) - Un ntreg pe 16 biti. Daca se specifica atributul UNSIGNED, domeniul SMALLINT de valori este cuprins ntre 0 si 65535; n caz contrar, domeniul este SMALLINT UNSIGNED cuprins ntre valorile 32768 si 32767 TIME - Ora n format ora-minut-secunda; de exemplu, 08-20-00. O valoare de TIMESTAMP tip data si ora, n format an-luna-zi ora-minut-secunda; de exemplu, TIMESTAMP(m) 1976-01-05 00:00:00. Aceasta reprezentare este similara celei returnate
de functiile UNIX. Pt. stocare valoarea este transformata din timpul curent in UTC si transformata invers la solicitarea datei. - Un sir caracter de lungime variabila, cu un maximum de "m" caractere, unde m este mai mic dect 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: - Pentru cantitati foarte mari sau foarte mici, alegeti DOUBLE ca tip de date. - Pentru coloane care contin numere fara parte zecimala de dimensiuni medii, alegeti SMALLINT sau INTEGER ca tip de date. - Pentru alte coloane care contin date numerice, alegeti DECIMAL ca tip de date. - Alegeti CHAR sau VARCHAR ca tip pentru celelalte coloane, chiar si pentru cele care contin cifre, cum ar fi un cod postal. - 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.
Unde "tabel" este numele tabelului, "coloana" este numele unei coloane, "tip" este tipul datelor incluse n coloana, se poate specifica un numar nedefinit de coloane. De exemplu, comanda urmatoare creeaza un tabel numit "carte", care contine coloanele "carteid", "titlu" si "pret": CREATE TABLE carte (carteid CHAR(10), titlu VARCHAR(255), pret decimal(5,2)); - n afara tipului de date, intre paranteze, puteti specifica si alte atribute optionale ale unei coloane:
NOT NULL - Fiecare rnd trebuie sa contina o valoare a coloanei asociate; valorile nule nu sunt permise. DEFAULT valoare - Daca nu este data o valoare a coloanei asociate, se va presupune valoarea specificata. AUTO INCREMENT - MySQL va repartiza n mod automat un numar de serie ca valoare a coloanei asociate. PRIMARY KEY - Coloana asociata este cheia primara a tabelului care o contine.
Iata un exemplu ceva mai complicat de creare a unui tabel, care foloseste unele din aceste atribute optionale: CREATE TABLE carte (carteid CHAR(10) PRIMARY KEY, titlu VARCHAR(255) NOT NULL, pret DECIMAL(5,2) DEFAULT 50.00);
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:
De exemplu, pentru a revoca toate privilegiile (din toate bazele de date) utilizatorului "tip_rau", scrieti comanda: REVOKE ALL ON *.* FROM tip_rau; Comanda "GRANT" are si o forma mai complexa pentru a autoriza accesul numai la anumite coloane specificate. Forma avansata a acestei comenzi este:
GRANT privilegiu (coloane) ON tabel TO utilizator IDENTIFIED BY 'parola; sau GRANT privilegiu (coloane) ON baza_de_date.* TO utilizator IDENTIFIED BY 'parola;
- Unde "privilegiu" este privilegiul care urmeaza a fi extins, "coloane" sunt coloanele carora li se aplica privilegiul, iar "tabel", "baza_de_date", "utilizator" si "parola" au semnificatiile cunoscute. Sunt permise si forme similare ale comenzii REVOKE:
REVOKE privilegiu (coloane) ON tabel FROM utilizator; sau REVOKE privilegiu (coloane) ON baza_de_date.* FROM utilizator;
INSERT - care permite adaugarea de date in coloana specificata SELECT - care permite accesul de citire la rndurile care contin coloana specificata UPDATE - care permite actualizarea rndurilor care contin coloana specificata
De exemplu, pentru a permite unui utilizator sa obtina accesul la o coloana, fara a o modifica, puteti folosi o secventa de comenzi similara cu urmatoarea: REVOKE ALL ON carte FROM Marius; GRANT SELECT(carteid, titlu, pret), INSERT(carteid, titlu, pret), UPDATE(carteid, titlu, pret) ON carte TO php IDENTIFIED BY 'mypassword'; REVOKE INSERT(pret) ON carte FROM Marius; REVOKE UPDATE(pret) ON carte FROM Marius; - Prima comanda revoca toate privilegiile de la nivelul tabelului; n caz contrar, aceste privilegii le vor elimina pe cele situate la nivel de coloana. Pentru a vedea privilegiile acordate unui anumit utilizator, folositi urmatoarea comanda: SHOW GRANTS FOR nume_utilizator; Caracteristica privilegiilor furnizata de MySQL este mai sofisticata si furnizeaza mult mai multe optiuni. Pentru mai multe informatii, consultati manualul SQL de la adresa www.mysql.com
Egalitate Inegalitate Inegalitate, diferit de Mai mic decat Mai mare decat Mai mic sau egal cu Mai mare sau egal cu
Puteti compara valoarea unei coloane cu aceea a altei coloane, respectiv valoarea unei coloane cu o valoare string. Valorile string SQL (sirurile) trebuie sa fie incluse ntre ghilimele simple, nu ntre ghilimelele duble. Cnd unei coloane nu i-a fost repartizata nici o valoare, SQL i atribuie valoarea speciala NULL. De asemenea, programatorii pot atribui n mod explicit valoarea NULL unei coloane. Comparatiile obisnuite cu valori NULL, care folosesc operatorii de (in)egalitate, vor returna un rezultat fals. Totusi, puteti folosi operatorul special "<=>". care compara valorile tinnd cont de valoarea NULL. Daca folositi acest operator pentru a compara doua valori NULL, se obtine un rezultat adevarat. SQL include si numerosi operatori de comparatie non-algebrici: Operator Descriere x BETWEEN y AND z Adevarat, daca valoarea lui x este cuprinsa ntre valorile lui y si z x LIKE y Adevarat daca valoarea lui x este echivalenta cu modelul y x NOT LIKE y Adevarat daca valoarea lui x nu este echivalenta cu modelul y 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 rndurile care au pretul de carte mai mare dect 11 sau al caror titlu include sub-sirul 'Curs': SELECT titlu, pret FROM carte WHERE pret>11 OR titlu LIKE %Curs%;
Pentru a compara o valoare cu o expresie regulata n MySQL, folositi urmatoarea forma: x REGEXP y, unde "x" este valoarea care va fi testata, iar "y" este o expresie regulata, delimitata prin ghilimele simple.
INSERT INTO tabel (coloana1, coloana2) VALUES (valoare1, valoare2), (valoare3, valoare4), (valoare5, valoare6);
Pentru a modifica valoarea unui rnd sau mai multor rnduri existente ntr-un tabel, folositi o comanda "UPDATE", care are urmatoarea forma:
- Unde "tabel" este numele tabelului ale carui rnduri urmeaza sa fie modificate, "coloana1" este numele primei coloane care urmeaza a fi modificata, "valoare1" este valoarea care va fi repartizata n "coloana1", "coloana2" este numele celei de-a doua coloane care urmeaza a fi modificata, "valoare2" este valoarea care va fi repartizata n "coloana2", iar "conditie" identifica rndul sau rndurile care urmeaza a fi actualizate, dupa o anumita conditie. Poate fi actualizat un numar mai mare sau mai mic de coloane. Daca se doreste ca toate randurile coloanei sa fie actualizate, clauza "WHERE" poate fi omisa. De exemplu, comanda urmatoare modifica din coloana "titlu" numele asociat cartii in "Curs2", in randul unde coloana "pret" are valoarea 5. UPDATE carte SET titlu=Curs2 WHERE pret=5;
Pentru a sterge un rnd dintr-un tabel, folositi comanda "DELETE", care are urmatoarea forma: DELETE FROM tabel WHERE conditie; Daca se vrea a fi sterse toate rndurile tabelului, clauza WHERE poate fi omisa. De exemplu, comanda urmatoare sterge rndul din tabelul "carte" asociat titlului "Curs2": DELETE FROM carte WHERE titlu='Curs2';
4. Sortarea si gruparea
Deseori, este important ca datele sa fie raportate ntr-o anumita secventa. Puteti specifica ordinea de raportare a rezultatelor interogarii folosind clauza "ORDER BY", care are urmatoarea forma: ORDER BY valoare Daca se vor folosi mai multe cmpuri de sortare, acestea vor fi separate prin virgula. Daca doriti sa indicati o sortare descendenta, n locul uneia ascendente, specificati "DESC" dupa valoare. De exemplu, pentru a ordona toate cartile n functie de pret, de la cel mai mare la cel mai mic, respectiv dupa titlu pentru un pret egal, puteti folosi urmatoarea interogare: SELECT pret, titlu FROM carte ORDER BY pret DESC, titlu; Pentru a include numai titlurile care au un pret mai mare de 50, adaugati o clauza WHERE la comanda SELECT: SELECT pret, titlu FROM carte WHERE pret>50 ORDER BY pret DESC, titlu; SQL include functii care va permit sa raportati valori diferite, valori utile, precum un numar al rndurilor tabelului. Iata cele mai importante functii in acest sens: Functie Descriere count(*) - Numarul rndurilor din tabel - Numarul rndurilor 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 dect 1980, srieti urmatoarea interogare: SELECT count(*), avg(pret) FROM carte GROUP BY anul HAVING anul>1980 ORDER BY anul; Mai jos sunt afisati operatorii matematici folositi in SQL:
Adunare Scadere Inmultire Impartire SAU, la nivel de bit SI la nivel de bit Deplasare la dreapta Deplasare la stanga Complement la nivel de bit
1. Expresii si functii
SQL va permite sa formati expresii folosind valori din coloane, valori literale si functii. Ca si n PHP, puteti controla ordinea de evaluare a expresiilor SQL folosind paranteze pentru a delimita sub-expresiile care trebuie evaluate mai intai. Tabelele urmatoare rezuma functiile MySQL frecvent folosite Functii matematice frecvent folosite n MySQL Functie Descriere abs(x) - 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 dect x cos(x) - Cosinusul lui x, unde x este exprimat n radiani
exp(x) floor(x) log (x) mod(x,y) power(x,y) rand(x) sign(x) sin(x) sqrt(x) tan(x)
- Baza logaritmilor naturali (e) ridicata la puterea x - Cel mai mare ntreg care nu este mai mare dect x - Logaritmul natural al lui x - Restul mpartirii x/y - x la puterea y - Valoare aleatoare cu virgula, mai mare sau egala cu zero si mai mica dect unu - Valoarea -1, 0 sau 1, dupa cum valoarea lui x este negativa, zero sau pozitiva - Sinusul lui x, unde x este dat n radiani - Radacina patrata a lui x - Tangenta lui x, unde x este dat n radiani
\Functii sir frecvent folosite n MySQL Functie Descriere ascii(s) - Codul ASCII al octetului celui mai din stnga al sirului s char(n) - Caracter al carui cod ASCII este n concat(s1, s2) - Concatenarea sirurilor s1 si s2; cu alte cuvinte, s2 atasat la s1 - Sirul s, unde toate majusculele au fost transformate n lcase(s) minuscule left(s,n) - Primii n octeti ai sirului s, de la stnga la dreapta length(s) - Numarul octetilor din sirul s - Pozitia primei aparitii a lui s1 n s2, respectiv zero daca s1 nu se locate(s1, s2) gaseste n s2 ltrim(s) - Sirul s, cu eliminarea spatiilor de nceput right(s,n) - Primii n octeti din sirul s, de la dreapta la stnga - Sirul s1, completat la dreapta cu sirul s2 pna cnd rezultatul are rpad(s1,n,s2) lungimea n rtrim(s) - Sirul s, cu spatiile finale eliminate space(n) - Un sir alcatuit din n spatii - Sub-sir al lui s, care ncepe de la pozitia m si care are lungimea substring(s,m,n) n trim(s) - Sub-sir al lui s, cu spatiile initiale si finale eliminate ucase(s) - Sirul s, cu toate minusculele convertite n majuscule Functii MySQL de data si ora frecvent utilizate Functie Descriere dayofmonth(d) - Ziua din luna a datei specificate (1-31) - Ziua din saptamna a datei specificate (1 =duminica, 2=luni,, dayofweek(d) 7=smbata) dayofyear(d) - Ziua din an a datei specificate (1-366) hour(t) - Partea orelor din momentul de timp mentionat (0-23) minute(t) - Partea minutelor din momentul de timp mentionat (0-59) month(d) - Luna datei specificate (1-12) now() - Data si ora curenta second(t) - Partea secundelor din momentul de timp mentionat (0-59)
week(d) year(d)
- Saptamna din an a datei specificate (0-53) - Partea anilor din momentul de timp mentionat (1000-9999)
Functii specifice MySQL Functie Descriere database() - Returneaza numele bazei de date deschise get_lock(s,n) - Obtine o blocare a bazei de date - Returneaza o suma de control a sirului s, calculata dupa md5(s) algoritmul MD5 - Returneaza sirul s, criptat folosind algoritmul aplicat de MySQL password(s) parolei release_lock(s) - Anuleaza blocarea unei baze de date user() - Returneaza numele utilizatorului curent version() - Returneaza numarul versiunii MySQL
2. Uniri
SQL va permite sa obtineti accesul la mai multe tabele ntr-o singura interogare, n general, aceasta operatie se executa pentru ca datele dintr-un tabel sa poata fi folosite cu date din alt tabel. De exemplu, sa presupunem ca baza de date este asemanatoare celei prezentate mai jos, unde avem doua tabele, primul numit "persoane" iar cel de-al oilea numit "meserii", si o relatie cheie externa - cheie primara (persoanaid) asociaza cele doua tabelele. persoanaid nume AnNastere meserie persoanaid 001 George Washington 1732 Arhitect 003 002 John Adams 1735 General 001 003 Thomas Jefferson 1743 Filozof 002 Sa examinam urmatoarea interogare: SELECT nume, meserie FROM persoane, meserii WHERE persoane.persoanaid=meserii.persoanaid; - Constructiile "persoane.persoanaid" si "meserii.persoanaid" se numesc "nume definite", prima se refera la coloana "persoanaid" din tabelul "persoane", iar a doua se refera la coloana "persoanaid" a tabelului "meserii". - Clauza WHERE asigura o echivalenta ntre valoarea cheii externe din tabelul "meserii" cu aceea a cheii primare din tabelul "persoane", (n absenta clauzei WHERE, se va stabili o corespondenta ntre fiecare rnd din tabelul cu meserii si fiecare rnd din tabelul cu persoane; un asemenea rezultat, numit "produs cartezian", contine n general multe rnduri - majoritatea nedorite - si ca atare trebuie evitat). - Rezultatul interogarii de mai sus este un raport care indica numele si meseria asociata fiecarui angajat prezentat n tabelul "meserii". O interogare ca aceasta, care combina date din mai multe tabele, se numeste "unire". Sunt posibile si uniri mai complexe, care implica trei sau mai multe tabele. Daca un rnd dat din tabelul principal (aici "persoane") nu are nici un rnd asociat n tabelul cu detalii (aici "meserii"), rndul respectiv din tabelul principal nu va aparea n datele de iesire ale unei uniri. In cazul acesta, pentru a determina aparitia acestei nregistrari din tabelul principal, se poate folosi o categorie speciala de unire, cunoscuta sub numele de "unire la stnga" sau "unire exterioara la stnga". Iata un exemplu: SELECT nume, meserie FROM persoane LEFT JOIN meserii ON persoane.persoanaid=meserii.persoanaid;
Aceasta interogare va afisa toate persoanele, indiferent daca acestea au sau nu asociata o meserie. Persoanele fara o meserie au specificatia NULL n coloana corespunzatoare meseriei.
MySQL va executa comenzile din script ca si cum acestea ar fi scrise direct in linia de comanda. Exemplul de mai sus va crea o baza de date noua, numita "lucrudb", va acorda utilizatorului "php" toate drepturile in utilizarea acestei baze de date, dupa care va crea tabelul "angajat", cu 6 coloane ("angajatnr", "nume", "ore", "departament", "salariu", "data_angajare") in care vor fi adaugate trei linii.
Faptul ca limbajul PHP a devenit atat de popular se datoreaza in mare masura faptului ca acesta contine suport de functii pentru lucrul cu bazele de date.
Pentru terminara unei conexiuni la serverul MySQL se foloseste instructiunea: mysql_close();. Aceasta functie inchide conexiunea curenta. Functia returneaza TRUE n caz de reusita; n caz contrar, returneaza FALSE. n general, nu este necesara invocarea functiei mysql_close(), deoarece PHP nchide automat conexiunile deschise cu bazele de date atunci cnd un script si ncheie executia. Iata un exemplu de conectare la serverul MySQL si inchidere a conexiunii folosind functia mysql_close(): <?php $conn = mysql_connect( "localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); // Aici adaugati datele necesare lucrului cu serverul MySQL mysql_close(); ?>
Sau, o alta metoda pentru oprirea mesajelor de eroare, explicata in lectiile anterioare, este adaugand @ inaintea functiei.
mysql_close(); ?>
5. Crearea tabelelor
Dupa conectare si selectarea bazei de date putem crea tabele in cadrul bazei de date selectate. Pentru aceasta folosim limbajul SQL CREATE TABLE numeTabel (coloana1, coloana2, ...); impreuna cu functia mysql_query(). In exemplul urmator cream tabelul cu numele "carti" care contine urmatoarele campuri: Nume camp Tip id Identificator unic, Not Null, cheie primara nume Char(30) autor Char(25) gen Char(10) data_intrare Date pret Decimal(12,2) In stanga, la "Nume Camp", sunt trecute coloanele tabelului, iar in dreapta tipul acestora, coloana cu nume "id" fiind cheia primara. De asemenea, folosim indicatorul "AUTO_INCREMENT" pentru a preciza faptul ca MySQL va repartiza o valoare secventiala unica n coloana care serveste drept cheie primara a tabelului. Iata si scriptul PHP pentru creacrea tabelului: <?php $conn = mysql_connect("localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); $selectdb = mysql_select_db('lucrudb'); if (!$selectdb) echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ". mysql_error(); $sql = "CREATE TABLE `carti` (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, nume varchar(30) NOT NULL, autor varchar(25) , gen varchar(10) NOT NULL, data_intrare date, pret decimal(12,2))"; if (mysql_query($sql, $conn)) echo "Tabelul carti a fost creat <br />"; else echo "Tabelul carti nu a putut fi creat deoarece : ". mysql_errno(). " : ". mysql_error(); mysql_close(); ?> In exemplul de mai sus, variabila "$sql" contine comanda SQL pentru crearea acestui tabel. Instructiunea mysql_query($sql, $conn), executa aceasta comanda si in cazul in care rezultatul este TRUE se trimite la iesire sirul: "Tabelul carti a fost creat". In cazul in care instructiunea SQL nu a putut fi executata, functia mysql_query($sql) intoarce valoarea FALSE, afisand eroarea din cauza careia tabelul nu a putut fi creat.
cu cea a coloanelor Iata un exemplu, in care se foloseste tabelul "carti" creat mai sus <?php $conn = mysql_connect("localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); $selectdb = mysql_select_db('lucrudb'); if (!$selectdb) echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ". mysql_error(); $sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUES ('Glossa', 'Mihai Eminescu', 'poezie', '19-05-2009', '8')"; if (mysql_query($sql, $conn)) echo 'Datele au fost adaugate'; else echo "Datele nu au fost adaugate deoarece : ". mysql_errno(). " : ". mysql_error(); mysql_close(); ?> - In acest exemplu, datele "'Glossa', 'Mihai Eminescu', 'poezie', '19-05-2009', '8'" vor fi adaugate in coloanele "nume, autor, gen, data_intrare, pret" in aceeasi ordine in care sunt scrise si datele si coloanele. - Daca au fost adaugate cu succes, apare mesajul "Datele au fost adaugate", in caz contrar apare mesajul de eroare. Daca doriti sa adaugati mai multe linii in tabel, printr-o singura interogare, puteti folosi urmatorul model <?php // Aici adaugati comenzile pt. conectare si selectarea bazei de date $sql = "INSERT INTO `nume_tabel` (coloana1, coloana2, coloana3) VALUES ('date1', 'date2', 'date3'), ('valoare1', 'valoare2', 'valoare3'), ('text1', 'text2', 'text3')"; if (mysql_query($sql)) echo 'Datele au fost adaugate'; else echo "Datele nu au fost adaugate deoarece : ". mysql_errno(). " : ". mysql_error(); mysql_close(); ?> Observati sintaxa de scriere corecta a interogarilor MySQL in PHP, numele tabelului se scrie intre caracterele ( ` ` ) si valorile intre ghilimele simple ( ' ' )
Intr-un tabel MySQL daca dorim sa fie selectate doar acele randuri in care o colana are o anumita valoare, se adauga in comanda SQL formula: WHERE `coloana`='valoare' , dupa cum se vede in urmatorul exemplu. In acest exemplu vor fi selectate doar randurile din coloanele "col1" si "col2" unde "col1" are o anumita valoare fixa precizata. <?php // Se face conectarea la MySQL si selectarea bazei de date $conn = mysql_connect("localhost", "utilizator", "parola") or die("Unable to connect to MySQL"); $selectdb = mysql_select_db('baza_date'); if (!$selectdb) echo "Baza de date nu a putut fi selectata: ". mysql_errno(). " : ". mysql_error(); $val = 'cuvant'; // Variabila ce contine valoarea pt. coloana cautata $sql = "SELECT `col1`, `col2` FROM `tabel` WHERE `col1`='$val'"; $rezultat = mysql_query($sql, $conn); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } if (mysql_num_rows($rezultat) == 0) { echo '0 rezultate'; } else { // Parcurge si afiseaza randurile gasite while ($rand = mysql_fetch_assoc($rezultat)) { echo '<br />'. $rand['col1']. ' - '. $rand['col2']; } } ?> - "col1" si "col2" sunt coloanele din "tabel" care vrem sa fie selectate. Puteti adauga mai multe nume (separate prin virgula), sau pentru a selecta toate coloanele, se foloseste caracterul * Pe langa formula "WERE" pot fi folosite si comenzile AND (si) sau OR (sau), pentru a efectua selecturi mai complexe, sau mai precise, cautand randurile in functie de valorile mai multor coloane. - De exemplu, daca se doreste selectarea doar a randurilor in care avem "col1" cu valoarea "val1" si "col2" cu valoarea "val2"; randul selectat sa indeplineasca ambele conditii, se foloseste comanda SQL cu AND astfel: $sql = "SELECT `col1`, `col2` FROM `tabel` WHERE `col1`='$val1' AND `col2`='$val2'"; - Daca se doreste selectarea randurilor in care avem "col1" cu valoarea "val1" sau "col2" cu valoarea "val2"; randul selectat sa indeplineasca una (oricare) din aceste conditii, se foloseste comanda SQL cu OR astfel: $sql = "SELECT `col1`, `col2` FROM `tabel` WHERE `col1`='$val1' OR `col2`='$val2'";
$sql = "SELECT `col1`, `col2` FROM `tabel` WHERE `col1` LIKE '$term'"; - Valoarea lui '$term' poate fi un cuvant sau fraza exacta, ori o parte dintr-un cuvant, in acest caz se foloseste si caracterul "%", astfel, pot fi obtinute urmatoarele 4 cazuri:
'term' - va returna randurile in care valoarea coloanei este exact cuvantul "term", fara altceva. 'term%' - va gasi randurile in care valoarea coloanei incepe cu "term", cum ar fi: "term ceva", "termenii", etc. '%term' - va gasi randurile in care valoarea coloanei se termina cu "term", cum ar fi: "12term" "ceva term", etc. '%term%' - va returna randurile in care coloana are in valoarea ei (oriunde, si in interiorul continutului) termenul "term", cum ar fi: "term ceva" "ceva 12termeni", "ceva ex-terma altceva", etc.
De obicei, termenul cautat este preluat dintr-un formular. Trebuie sa tineti cont de modul in care au fost adaugate datele in tabelul MySQL, daca au fost filtrate cu o functie, precum "mysql_real_escape_string()", cand se face selectul pentru cautare trebuie aplicata aceeasi functie termenului cautat. - Mai jos puteti studia si folosi codul unui model de script, cu formular, pentru selectarea dintr-un tabel MySQL a randurilor in care se gaseste termenul transmis prin formular. Explicatiile detaliate sunt in codul scriptului.
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ro"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Script cautare MySQL</title> <meta name="description" content="Script cu formular pt cautare in tabel MySQL. Tutorial de la http://www.marplo.net" /> <meta name="keywords" content="script cautare" /> </head> <body> <form action="" method="post"> <input type="text" name="term" /> <input type="submit" name="submit" value="Cauta" /> </form> <?php // Script - Tutorial de la http://www.marplo.net // Se verifica daca e primita valoare de la formular si are mai mult de 1 caracter if (isset($_POST['term']) && strlen($_POST['term'])>1) { // Preia valoarea, eliminand posibile spatii exterioare $term = trim($_POST['term']); // Se face conectarea la serverul MySQL si selectarea bazei de date $conn = mysql_connect("adresaServerMySQL", "utilizator", "parola") or die("Nu m-am putut conecta la serverul MySQL"); $selectdb = mysql_select_db('baza_date'); if (!$selectdb) echo "Baza de date nu a putut fi selectata: ". mysql_errno(). " : ". mysql_error();
// Se verifica daca "magic_quotes_gpc()" este setat ON // Daca e ON, se aplica stripslashes() pentru a nu se adauga de 2 ori "\" la filtrare if(get_magic_quotes_gpc()) { $term = stripslashes($term); } // Se aplica filtrarea cu mysql_real_escape_string() (la adaugarea datelor trebuie sa fi fost folosita aceeasi filtrare) $term = mysql_real_escape_string($term); // Se face selectarea si afisarea dateor returnate $sql = "SELECT * FROM `nume_tabel` WHERE `nume_coloana` LIKE '%$term%'"; $resql = mysql_query($sql, $conn) or trigger_error(E_USER_ERROR); if (mysql_num_rows($resql) == 0) { echo '0 rezultate'; } else { while ($rand = mysql_fetch_assoc($resql)) { // Elimina caracterele "\" care au fost adaugate de "mysql_real_escape_string()" $col = stripslashes($rand['nume_coloana']); echo '<br />'. $col; } } } ?> </body> </html>