Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
SUPORT DE CURS
PHP
Modulul 4 Tehnologii Web avansate
Specializare: WebProgramator
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
CUPRINS
CAPITOLUL 1. INTRODUCERE IN LIMBAJUL PHP .......................................................................................................... 3 1.2.CREAREA UNUI SCRIPT PHP ............................................................................................................................................ 4 CAPITOLUL 2. ELEMENTE DE BAZA ALE LIMBAJULUI PHP............................................................................................ 6 2.1.TIPURI DE VARIABILE ..................................................................................................................................................... 6 2.2.DECLARAREA VARIABILELOR IN PHP ............................................................................................................................... 12 2.3.DOMENIUL DE VALABILITATE AL VARIABILELOR ................................................................................................................. 13 2.4.OPERATORI ............................................................................................................................................................... 15 2.5. STRUCTURI DE CONTROL ............................................................................................................................................. 17 2.6. UTILIZAREA MATRICELOR ............................................................................................................................................. 23 CAPITOLUL 3. FUNCTII PHP ....................................................................................................................................... 27 CAPITOLUL 4. PHP SI FORMULARELE HTML .............................................................................................................. 31 4.1. CREAREA UNUI FORMULAR .......................................................................................................................................... 31 4.2. UTILIZAREA METODELOR GET SI POST .......................................................................................................................... 31 4.3. RECEPTIONAREA DATELOR DE LA UN FORMULAR HTML .................................................................................................... 32 4.4. TRATAREA ERORILOR .................................................................................................................................................. 35 4.5. EXERCITIU ................................................................................................................................................................ 35 CAPITOLUL 5. FISIERE SI DIRECTOARE ....................................................................................................................... 36 5.1. CREAREA, SCRIEREA FISIERELOR .................................................................................................................................... 36 5.2. BLOCAREA FISIERELOR ................................................................................................................................................ 38 5.3. CITIREA FISIERELOR .................................................................................................................................................... 40 5.4. CREAREA SI PARCURGEREA DIRECTOARELOR. ................................................................................................................... 43 5.5. DREPTURI DE ACCESS LA FISIERE .................................................................................................................................... 45 CAPITOLUL 6. SITE-URI DINAMICE, LUCRUL CU BAZELE DE DATE .............................................................................. 46 6.1. CONECTAREA LA SERVERUL MYSQL; TRATAREA ERORILOR ................................................................................................. 46 6.2. CREAREA SI SELECTAREA UNEI BAZE DE DATE ................................................................................................................... 48 6.3. CREAREA TABELELOR, SCRIPTURI SQL ............................................................................................................................ 50 6.4. ADAUGAREA, INSERAREA DATELOR INTR-O TABELA ........................................................................................................... 52 6.5. CITIREA DATELOR DINTR-O TABELA SAU INTEROGARE ........................................................................................................ 53 6.5. CITIREA DATELOR DINTR-O TABELA SAU INTEROGARE ........................................................................................................ 55 CAPITOLUL 7. SESIUNI SI COOKIE-URI ....................................................................................................................... 56 7.1. DESPRE SESIUNI, CREAREA UNEI SESIUNI PHP .................................................................................................................. 56 7.2 MANIPULAREA VARIABILELOR SESIUNII. ........................................................................................................................... 58 7.2. STERGEREA UNEI SESIUNI ............................................................................................................................................ 59 7.3. CREAREA SI CITIREA COOKIE-URILOR .............................................................................................................................. 60 7.3. INTRODUCEREA PARAMETRILOR INTR-UN COOKIE ............................................................................................................. 63 7.4. MONITORIZAREA VIZITATORILOR UNUI SITE ..................................................................................................................... 64 7.5 STERGEREA COOKIE-URILOR .......................................................................................................................................... 67 CAPITOLUL 8. UTILIZAREA CLASELOR IN PHP ............................................................................................................ 68 8.1 DESPRE POO, AVANTAJELE UTILIZARII CLASELOR ............................................................................................................... 68 8.2. DECLARAREA CLASELOR, CLASE DERIVATE ....................................................................................................................... 68 8.3. INSTANTIEREA CLASELOR; STERGEREA INSTANTELOR UNEI CLASE .......................................................................................... 70 CAPITOLUL 9. EXEMPLU DE SCRIPT PHP ................................................................................................................... 74 Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Capitolul 1. INTRODUCERE IN LIMBAJUL PHP
1.1.Notiuni elementare de sintaxa PHP
Limbajul PHP a fost creat in anul 1994 de catre Rasmus Lerdorf, care incerca sa-si personalizeze propria pagina Web; din acest motiv limbajul a fost numit initial PHP adica: Personal Home Page (pagina de baza personala). Ulterior limbajul a fost perfectionat, utilitatea si caracteristicile sale s- au dezvoltat treptat, ajungand sa aiba semnificatia Hypertext Preprprocesor (PHP). Preprocesarea consta in aceea ca datele sunt interpretate(preprocesate) de catre serverul Web inainte ca acesta sa genereze cod HTML.
Secventele de cod PHP pot fi incluse intr-un fisier HTML; ulterior serverul Web va identifica aceasta secventa de cod , va procesa acesta secventa de cod generand cod HTML iar la final va inlocui secventa de cod PHP cu codul HTML.
Limbajul PHP este folosit pentru o gama impresionanta de operatii, cu ajutorul acestui limbaj putem crea site-uri dinamice, adica site-uri care vor interactiona cu end-userul, furnizand continut in concordanta cu optiunile selectate de utilizator.
Printre caracteristicile cele mai importante ale limbajului enumeram: -simplitate: acest limbaj este simplu de folosit, fiind accesibil si ne-programatorilor. Datorita acestui fapt el a devenit cel mai popular limbaj de script pentru generarea de pagini HTML dinamice.
-usor de folosit : limbajul are o sintaxa asemanatoare limbajului C, care este foarte popular in randul programatorilor. De aceea programatorii cu cunostine de C sau Perl vor face foarte rapid trecerea spre PHP. Pe de alta parte anumite aspecte cum ar fi: declararea si folosirea variabilelor este mult simplificata in PHP, spre deosebire de C++ sau alte limbaje de nivel inalt.
-eficienta: specificatiile limbajului includ folositea tehnicilor de POO (Programare orientata pe obiecte) iar acest lucru contribuie la marirea productivitatii: un programator PHP poate folosi module scrise de un alt programator fara sa fie nevoit sa cunoasca detalii specifice de impementare a codului.
-cross-platform : exista implementari ale limbajului pe mai multe sisteme de operare, cele mai populare fiind cele de pe sistemele Linux si Windows. In acest caz daca scriem cod PHP care ruleaza pe un sistem Linux, ulterior vom putea folosi acest cod pe un server care ruleaza Windows si viceversa.
-free : PHP reprezinta un Open Source software, oricine poate folosi acest limbaj fara a fi nevoit sa plateasca ceva. De asemenea utilizatorii au access la sursele PHP (scrise in limbajul C). Site-ul oficial al limbajului PHP se afla la : www.php.net , datorita popularitatii acestui limbaj exista numeroase site-uri Web care prezinta informatii despre PHP, exemple de cod, forum de discutii , etc.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Limbajul PHP reprezinta o tehnologie server, de aceea el nu poate fi folosit pentru operatii pe partea de client . Din acest punct de vedere limbajul PHP nu poate inlocui limbajul Java Script. Pe de alta parte putem folosi limbajul PHP pentru a generera cod Java Script.
O secventa de cod PHP incepe intotdeauna cu caracterul escape : <?php , urmat de una sau mai multe instructiuni PHP. Sfarsitul secventei de cod PHP este marcat de caracterul escape : ?>.
In acest fel serverul Web va identifica secventele <?php si ?> si va interpreta tot ce se afla in interiorul acestor doua secventa ca si cod PHP. Pentru a vedea daca serverul Web este configurat astfel incat sa interpreteze codul PHP putem crea un fisier simplu ( folosind un editor de text, de exemplu Notepad), iar in acest fisier vom scrie urmatoarea secventa:
<?php phpinfo(); ?>
Salvam acest fisier cu numele de : phpinfo.php in directorul pentru documente Apache, in general acest director se numeste htdocs si se gaseste in directorul unde a fost instalat serverul Apache. In acest moment deschideti browserul de pe sistemul dvs., iar ca adresa URL introducem : http://localhost/phpinfo.php; ar trebui sa vedeti o pagina Web cu informatiile de configurare a modulului PHP.
1.2.Crearea unui script PHP
Codul PHP poate fi inserat intr-un fisier HTML, de aceea, pentru inceput, vom crea o pagina HTML asupra careia vom face unele modificari:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head><title>Test</title> </head> <body> <?php echo <p>Bun venit la site-ul nostru !!! <p>; ?> </body> </html> Dupa cum observati am inserat in aceasta secventa de cod HTML o secventa de cod PHP, care incepe cu secventa <?php si se termina cu secventa ?>.
Elementul echo reprezinta o instructiune a limbajului PHP si va instrui serverul Web sa insereze secventa: <p>Bun venit la site-ul nostru !!! <p> in codul HTML.
Astfel secventa HTML generata de serverul Web va fi urmatoarea: Secventa sfarsit cod PHP Instuctiune PHP Secventa pentru start cod PHP Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head><title>Test</title></head> <body> <p>Bun venit la site-ul nostru !!! <p> </body> </html>
In realitate nu avem nevoie de PHP pentru a genera o secventa atat de simpla de cod HTML.
In exemplul urmator vom declara citeva variabile PHP, dupa care vom insera continutul acestora in codul HTML:
Salvam acest fisier sub numele test1.php, dupa care deschidem browserul iar ca adresa folosim http://localhost/test1.php. In fereastra browserului va fi incarcata o pagina ca in figura de mai jos:
Observam cum variabilele declarate in prima sectiune de cod PHP au fost utilizate pentru a genera cod HTML corespunzator.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Capitolul 2. ELEMENTE DE BAZA ALE LIMBAJULUI PHP
2.1.Tipuri de variabile
In limbajul PHP exista 8 tipuri pricipale 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).
De exemplu secventa urmatoare:
<?php $boolVar = TRUE; // o variabila de tip boolean $intVar = 200; // o variabila de tip integer $strVar = Popescu Ion; // o variabila de tip string echo gettype($boolVar); // afiseaza boolean echo gettype($strVar); // afiseaza string if (is_int($intVar)) { // daca variabila $intVar este de tip integer $intVar += 100; // adauga 100 ; noua valoare va fi $intVar = 300; } echo dump_var($strVar); // afiseaza tipul si valoarea variabilei $strVar ?>
defineste trei variabile, tipurile acestora sunt respectiv: boolean, intreg respectiv string. Putem afla tipul unei variabile folosind functia gettype() care returneaza un string continand tipul variabilei cercetate.
Functia is_int() returneaza TRUE daca variabila furnizata ca parametru este de tip integer. Alte functii similare sunt : is_string(), is_bool().
Functia dump_var() afiseaza tipul si valoarea unei variabile si este folosita de obicei in scopul depanarii codului PHP.
Tipul boolean variabilelele de tipul boolean pot lua doar doua valori : FALSE sau TRUE
<?php $boolVar = TRUE; // aceste doua declaratii $boolVar1 = True; // sunt echivalente $boolVar2=FALSE; // Expresiile TRUE si FALSE sunt case-insensitive $boolVar3=False; echo dump_var($strVar); // afiseaza tipul si valoarea variabilei $strVar ?>
In exemplul de mai sus am declarat patru variabile de tipul boolean. Se observa ca putem initializa valoarea variabilelor folosind literalele TRUE sau True, respectiv FALSE sau False; nu se face distinctie aici intre literele mari sau mici.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Variabilele de alt tip decat boolean pot fi convertite la tipul boolean prin operatorul cast (bool) . Urmatoarele valori vor fi convertite implicit in variabile booleene cu valorea false: - variabile booleene cu faloarea false - variabile intregi cu valoarea 0 - variabile float cu valoarea 0.0 - variabile string cu continut nul : - variabile array (tablou) cu numar de elemente zero - obiecte cu numar de membrii zero - tipul special NULL , folosit in general pentru referinte spre obiecte
Tipul integer reprezinta numere, ele pot fi specificate in format zecimal, hexazecimal sau octal. In tabelul urmator prezentam cateva declaratii de variabile intregi:
<?php $var1 = 215678; //Numar in reprezentare zecimala $var2 = 0x1A8; //Numar in reprezentare hexazecimala //reprezinta: 1*16*16 + 10*16 + 8 = 424 (in zecimal) $var3 = 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 :-2 13 repectiv: 2 13 .
Daca incercam sa folosim un integer cu valori care ies din acest inteval vo 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 a acestui rezultat putem folosi operatorul cast (int).Pentru a rotunji rezultatul la intregul cel mai apropiat de valoarea reala folosim functia round() :
Tipul float reprezinta variabile de tip real. De exemplu:
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
<?php $var1 = 234.4324356; //variabila de tip float $var2 = 1.2e3; //reprezinta :1.2 * 10 3
$var3 = 8E-10; //reprezinta : 8*10 -10
?>
Tipul string reprezinta o insiruire de caractere, fiecare caracter este memorat pe 1 byte; setul de caractere este limitat la 256 valoari distincte. Dimensiunea sirurilor poate fi oricat de mare in PHP, nu exista specificatii care sa limiteze numarul maxim de caractere dintr-un sir.
In PHP, un sir poate fi declarat in mai multe feluri: prin delimitare cu ghilimele simple: ' prin delimitare cu ghilimele duble: " prin sintaxa heredoc
Delimitarea cu ghilimele simple este cea mai simpla reprezentare a sirurilor de caractere in PHP. Daca dorim ca sirul sa contina caracterul ' va trebui sa folosim inseram inaintea lui caracterul escape \. Daca dorim ca sirul sa contina caracterul \ va trebui sa dublam acest caracter. Aceast comportament este exemplificat in exemplul urmator:
<?php $var1 = ' Acesta este un sir de test'; //variabila de tip sir echo $var1; // afiseaza : Acesta este un sir de test echo 'Institultul \'Multimedia\''; // afiseaza : Institutul 'Multimedia' echo 'Vrei sa stergi C:\\*.* ?'; // afiseaza Vrei sa stergi C:\*.* ? echo 'Variabila var1=$var1'; // afiseaza : Variabila var1=$var1 ?>
Dupa cum se observa in ultima linie variabila $var1 nu este expandata adica nu va fi afisat: Variabila var1=Acesta este un sir de test. Pentru a realiza acest lucru se folosesc ghilimelele duble. Delimitarea cu variabile duble permite expandarea valorilor variabilelor continute in sir. Pe de alta parte sunt recunoscute urmatoarele caractere ESCAPE:
\n Linie noua \r Carriage return ( rand nou) \t Tab orizontal \\ backslash \$ Semnul dolar \" Ghilimele duble
Daca un caracter dolar: $ va fi intalnit in sirul de caractere delimitate cu ghilimeme duble, PHP va analiza urmatoarele caractere incercand sa gaseasca o variabila cu acelasi nume declarata anterior. Daca va fi gasita valoarea acestei variabile va inlocui sirul $(nume variabila). Acest lucru este exemplificat in exemplul urmator:
<?php $var1 = 'Popescu'; echo "Candidatul $var1 a fost admis"; // afiseaza: Candidatul Popescu a fost admis echo "Candidatul $var1a fost admis"; // afiseaza: Candidatul $var1a fost admis Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
echo "Candidatul ${var1}a fost admis"; // afiseaza: Candidatul Popescua fost admis ?>
In anumite situatii pentru a nu da nastere la confuzii este bine sa includem numele variabilelor intre acolade {} ; in acest caz vom fi siguri ca interpretorul PHP va folosi numele corect al variabilelor.
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='Ion'; echo 'Numele de familie este '.$nume. 'iar prenumele este '.$prenume; ?>
In acest caz ultima linie de cod va afisa: Numele de familie este Popescu iar prenumele este Ion. Se observa cum operatorul de concatenare a sirurilor combina textul predefinit cu variabilele declarate anterior.
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'; //variabila de tip sir echo $var1{0}; // afiseaza A (primul caracter din sir) echo $var1{1}; // afiseaza c ( al doilea caracter din sir) $var1{0} = 'C'; // modifica primul caracter din sir la valoarea C ?>
Functii importante pentru manipularea sirurilor: - strlen($var1) retuneaza lungimea sirului $var1 - string ltrim ( string str) elimina caracterele spatiu de la inceputul sirului - string rtrim ( string str) elimina caracterele spatiu de la sfarsitul sirului - int strncmp ( string str1, string str2, int len ) compara primele len caractere din cele doua siruri - string strtolower ( string str ) converteste la setul de caractere mici - string strtoupper ( string str ) converteste la caractere mari - string strtr ( string str, string from, string to ) translateaza un sir - int stripos ( string haystack, string needle [, int offset] ) gaseste prima aparitie a sirului needle in sirul haystack
In continuare exemplificam folosirea acestor functii:
<?php $var1 = ' Sir de test'; //variabila de tip sir echo $var1; // afiseaza: Sir de test echo ltrim($var1); // afiseaza:Sir de test $var2 = ' Sir de test modificat'; //variabila de tip sir Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
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 trebie 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.
Exemplu: <?php $var1 = <<< EOT Exemplu de sir care foloseste delimitatorul heredoc. EOT; echo $var1; //afiseaza: Exemplu de sir care // foloseste delimitatorul heredoc. ?>
Tipul array reprezinta un vector de valori, fiecare element al vectorului are asociata o cheie. Aceasta cheie va fi folosita ulterior la identificarea unui element specific at vectorului. In PHP tipul array se mai numeste si tip map ordonat , deoarece elemente vectorului sunt ordonate dupa campul cheie.
O variabila de tip array se poate declara in mai multe feluri: <?php $fructe[3]; $fructe[0] = 'mere'; $fructe[1] = 'pere'; $fructe[2] = 'cirese'; //Variabila $fructe de mai sus se mai poate declara si astfel: $fructe1 = array("mere", "pere", "cirese");
//Referirea elementelor se face in felul urmator: echo $fructe[0]; // afiseaza mere echo $fructe[1]; // afiseaza pere echo $fructe[2]; // afiseaza cirese echo $fructe1[0]; // afiseaza mere echo $fructe1[1]; // afiseaza pere ?> Cheile pot avea valori intregi sau pot fi siruri de caractere; este posibil sa mixam chei intregi si de tip caracter, ca in exemplul urmator:
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
//Variabila $fructe de mai sus se mai poate declara si astfel: $fructe1 = array("mere", "pere", "cirese");
//Referirea elementelor se face in felul urmator: echo $fructe[0]; // afiseaza mere echo $fructe[1]; // afiseaza pere echo $fructe[2]; // afiseaza cirese echo $fructe1[0]; // afiseaza mere echo $fructe1[1]; // afiseaza pere unset($myArray[20]]; // sterge elementul cu cheia 20 din array unset($myArray); // strege elementul myArray in intregime ?>
Este posibil ca un element al vectorului sa fie de asemenea de tip array. In acest caz avem de-a face cu un array multidimensional:
In cazul 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.
Tipul object reprezinta de fapt instanta unei clase declarate in PHP. O cllasa este o structura care contine variabile membru si functii membru. De exemplu declaram o clasa care Memoreaza datele personale ale unui user:
<?php class PersUI = { var $name=null; var $adresaEmail=null; var $logged=null; //PersUI constructor function PersUI() { $name=""; $adresaEmail="; $logged=FALSE; } //functie pentru setarea numelui function setName($aName) { $name=$aName; Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
} //functie pentru obtinerea numelui function getName() { return $name; } function setAdresaEmail($emailAdress) { $adresaEmail = $emailAdress; } function getAdresaEmail() { return $adresaEmail; } function isLogged() { return $logged; } } $myPers = new PersUI(); $myPers->setName("Ionescu"); $myPers->setAdrresaEmail("Ionescu@yahoo.com"); echo $myPers->getName(); // Afiseaza Ionescu echo $myPers->getAdresaEmail(); // Afiseaza Ionescu@yahoo.com echo $myPers->isLogged(); // Afiseaza false ?>
Declaratia clasei incepe cu variabilele membru : name, adresaEmail, logged care initial au valoarea null, adica nu sunt initializate( nu au nici un fel de valoare asociata).
Urmeaza portiunea unde sunt declarate functiile; acestea pot avea un argument sau pot fi fara argumente. De exemplu functia setName($aName) va asocia variabilei membru $name valoarea continuta in varibila furnizata ca parametru : $aName; Functia getName() nu are nici un parametru dar ea returneaza valoarea continuta in variabila $nume.
Crearea unui obiect de tipul PersUI se face prin linia: $myPers = new PersUI; myPers este o variabila de tip obiect si reprezinta o instanta a clasei PersUI.
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 fisierelelor, resurse COM, etc...
Odata cu PHP 4.0 a fost introdus un mecanism care elibereaza automat memoria alocata pentru referintele care nu mai sunt referite in program. Acest mecanism se numeste garbage collection (colectorul de gunoaie) ; un mecanism similar functioneaza in limbajul Java.
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 - varibila a fost stearsa prin functia unset();
2.2.Declararea variabilelor in PHP
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
In limbajul PHP variabilele sunt reprezentate prin semnul $ urmat de numele variabilei. Numele variabilei este case sensitive, adica conteaza faptul ca numele este scris cu litere mari sau mici. Intotdeuna numele variabilelor incepe cu o litera sau underscore(_) si poate fi urmat de litere sau cifre. In PHP tipul variabilelor se specifica in momentul declararii lor:
<?php $varInt = 12371; //variabila de tip integer $varBool = TRUE; //variabila de tip boolean $varStr = "sir de test"; //variabila de tip string $myArray = array("alpha","beta","gama"); // variabila de tip array $var1 = 124; $var2 = &$var1; echo $var2; $var2 = "valoarea lui var2= $var2"; echo $var2; //afiseaza: valoarea lui var3= 124 echo $var1; //afiseaza: valoarea lui var3= 124 ?>
In exemplul de mai sus am folosit si o alta metoda de initializare a variabilelor si anume initializarea prin referinta: $var2 = &$var1; in acest caz variabila var2 va referi zona de memorie alocata variabilei $var1.In acest caz o modificare facuta asupra lui var2 se va propaga automat si asupra variabilei var1.
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 Web Server sau relative la contextul in care se executa scriptul curent $_GETvariabile furnizate scriptului via URL $_POSTvariabile furnizate scriptului prin metoda HTTP POST $_COOKIE variabile furnizate scriptului via HTTP cookie $_FILES furnizeaza scriptului fiseierele uploadate $_SESSION variabile care sunt inregistrate in sesiunea scriptului
2.3.Domeniul de valabilitate al variabilelor
Domeniul de valabilitate al variabilelor(variable scope) reprezinta contextul in care aceste variabile sunt definite. In afara acestui domeniu variabilele nu exista(nu sunt recunoscute). Sa consideram urmatorul exemplu in care declaram doua variabilede tip intreg si o functie care incearca sa faca suma celor doua variabile:
<?php $var1 = 124; $var2 = 200; function makeSum() { return $var1 + $var2; Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
} echo makeSum(); //nu afiseaza nimic ?>
Functia makeSum() foloseste variabilele $var1 si $var2 declarate anterior, dar aceste variabile nu au domeniu de valabilitae in interiorul functiei.Prin urmare rezultatul functiei este NULL. Pentru a rezolva aceasta problema vom declara cele douva variabile ca fiind externe functiei , adica variabile globale: <?php $var1 = 124; $var2 = 200; function makeSum() { global $var1,$var2; return $var1 + $var2; } echo makeSum(); //afiseaza 224 ?>
In exemplul de mai sus declaratia: global $var1,$var2 face ca variabilele $var1,$var2 sa fie recunoscute si in interiorul functiei.
O alta metoda prin care putem solutiona aceasta problema este prin folosirea variabilei PHP predefinite $GLOBALS.
$GLOBALS este de fapt un array ; elementele acestui array au cheia egala cu numele variabilelor declarate, iar urmatorul cimp egal cu valoarea lor. $GLOBALS este o variabila superglobala, ea va fi recunoscuta in orice script.
Variabilele declarate in interiorul unei functii se numesc variabile locale functiei si nu au doeniul de valabilitate in afara functiei. Aceste variabile sunt create pe stiva, de aceea la iesirea din functie acestea vor fi automat distruse.
<?php function makeSum() { $var1 = 124; $var2 = 200; return $var1+ $var2; } echo $var1; //nu afiseaza nimic. Variabila $var1 out of scope echo $var2; //nu afiseaza nimic. Variabila $var2 out of scope echo makeSum(); //afiseaza 224 ?> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
O alta categorie importanta de varibile (din punctul de vedere al domeniului) sunt variabilele statice. Aceste variabile sunt valabile in domeniul functiei unde au fost declarate , dar au proprietatea ca valaorea lor nu se altereaza la un apel succesiv al functiei:
In anumite situatii avem nevoie ca numele variabilelor sa fie variabil , adica sa putem schimba numele variabilei in momentul executiei programului (run-time). In acest scop exista asa numitele variable variables :
Se observa ca a doua declaratie: $$var1='Ionescu' creeaza o noua variabla cu numele $nume si ii atribuie valoarea 'Ionescu'.
2.4.Operatori
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.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Operatori pe siruri actioneaza asupra sirurilor de caractere:
<?php $var1 = 'Ionescu'; echo 'Numele candidatului este '.$var1; //Afiseaza Numele candidatului este Ionescu $var2 = 'Candidat: '; $var2 .= $var1; echo $var2; //Afiseaza: 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'.
Operatori logici sunt folositi pentru a lua decizii la un moment dat in program . Rezultatul operatorilor logici este o variabila de tip boolean , care poate fi folosita ulterior in instructiuni conditionale (if , asa cum vom vedea in continuare)
$a && $b TRUE daca a si b sunt TRUE $a AND $b TRUE daca a si b sunt TRUE $a || $b TRUE daca a sau b sunt TRUE $a OR $b TRUE daca a sau b sunt TRUE $a TRUE daca $a=FALSE NOT $a TRUE daca $a=FALSE $a XOR $b TRUE daca numai $a sau numai $b sunt TRUE $a == $b TRUE daca $a=$b $a = $b TRUE daca $a diferit de $b $a < $b TRUE daca $a mai mic ca $b $a <= $b TRUE daca $a mai mic sau egal cu $b $a > $b TRUE daca $a mai mare ca $b $a >=$b TRUE daca $a mai mare sau egal cu $b
Operatori pe biti sunt folositi pentru a realiza operatii logice pe biti asupra operanzilor. $a & $b And logic pe biti intre a si b $a | $b Sau logic pe biti intre a si b $a ^ $b XOR (Exclusive OR) pe biti intre a si b ~$a Negare pe biti 01; 10 $a >> $b Deplasare cu $b biti la dreapta a operandului $a $a << $b Deplasare cu $b biti la stanga a operandului $a
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
2.5. Structuri de control
reprezinta de fapt instructiuni PHP care permit programatorilor luarea de decizii privind executia codului.
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 rezultatul expresiei logice este true, se vor executa instuctiunile: Instructiune(1), apoi Instructiune(2), etc... Se observa ca acest set de instructiuni se plaseaza intre acolade. Doar intr-un singur caz aceste acolade nu sunt necesare si anume: in cazul in care setul de instructiuni contine 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 fi plasat la instructiunea care urmeaza dupa acolada:}.
Instructiunea if poate fi completata cu clauza : else, dupa cum urmeaza:
In acest din urma caz, daca expresia logica 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(01); Instructiune(02);
Clauza else poate fi urmata de asemenea de o instructiune if :
If(conditie1) { Instructiune(1); Instructiune(2); .................. Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
In acest caz daca conditie1 este TRUE se executa Instructiune(1), respectiv Instructiune(2);
Daca conditie1 este FALSE, dar conditie2 este TRUE se executa: Instructiune(01), respectiv Instructiune(02);
Daca conditie1 este FALSE si conditie2 este FALSE se executa : Instructiune(001), respectiv Instructiune(002).
In continuare vom vedea cum se foloseste instructiunea if pentru a compara valorile a doua variabile numerice:
<?php if($a > $b) { echo 'Valoarea variabiei a este mai mare ca variabila b'; } else if($a == $b) { echo 'Valoarea variabilei a este egala cu variabila b'; } else { echo 'Valoarea variabilei a este mai mica decat cea a variabilei b'; } ?>
In exemplul de mai sus am presupus ca variabilele $a si $b sunt create anterior si au valori numerice.
Observatie: in locul instructiunii compuse else if(conditie ) se poate folosi clauza elseif.
In cazul in care vrem sa comparam valoarea unei singure variabile cu o succesiune de valori, in locul instructiunii if putem folosi instructiune switch: <?php switch($a) { case 0: echo 'Valoare variabilei $a este 0'; break; Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
case 1: echo 'Valoare variabilei $a este 1'; break; case 2: echo 'Valoare variabilei $a este 2'; break; case 3: echo 'Valoare variabilei $a este 3'; break; } ?>
Executia instructiunii switch continua pana cand se intalneste o valoare corespunzatoare pentru variabila $a. In acest caz, se afiseaza un mesaj, iar daca instructiunea este urmata de clauza: break; instructiunea switch se va sfarsi. De retinut ca instructiune break; opreste executia instructiunii switch.
Variabila $a poate avea si tipul string, de exemplu; in aest caz valorile cu care se compara vor avea de asemenea tipul string.
Structuri de control repetitive (cicluri): - while - do-while - for - foreach
2.5.2. Instructiunea WHILE
Instructiunea while executa un set de instructiuni atata timp cat valoarea expresiei: conditie este adevarata:
Setul de instructiuni Instructiune(1), Instructiune(2), etc... se vor executa atata timp cat valoarea expresiei logice : conditie are valoarea TRUE. <?php $iCrt=0; while($iCrt < 10) { echo 'Valoare variabilei $iCrt este:'.$iCrt; $iCrt++; } ?> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Secventa de mai sus va genera urmatoarea secventa: Valoare variabilei $iCrt este:0 Valoare variabilei $iCrt este:1 Valoare variabilei $iCrt este:2 Valoare variabilei $iCrt este:3 Valoare variabilei $iCrt este:4 Valoare variabilei $iCrt este:5 Valoare variabilei $iCrt este:6 Valoare variabilei $iCrt este:7 Valoare variabilei $iCrt este:8 Valoare variabilei $iCrt este:9
Se observa ca ciclul are 10 iteratii, instructiunea $iCrt++; este echivalenta cu $iCrt=$iCrt+1, si incrementeaza valoarea variabilei $iCrt cu 1.
Executia ciclului while poate fi oprita cu instructiunea break: <?php $iCrt=0; while($iCrt < 10) { echo 'Valoare variabilei $iCrt este:'.$iCrt; if($iCrt >5) { break; } $iCrt++; } ?> In cazul de mai sus , in momentul in care valoarea variabilei $iCrt este mai mare ca 5 se va executa instructiune break; care opreste executia ciclului while.
2.5.3. Instructiunea DO-WHILE
Instructiunea do-while se aseamana cu instructiunea while de mai sus, dar in acest caz conditia se testeaza la sfarsitul ciclului, cel putin o data. Sintaxa instructiunii este urmatoarea: do { Instructiune(1); Instructiune(2); Instructiune(3); ............. } while(conditie); <?php $iCrt=0; do { echo 'Valoare variabilei $iCrt este:'.$iCrt; $iCrt++; } while($iCrt < 10); ?> In exemplul de mai sus instructiunile dintre acolade {} se vor executa de 10 ori. Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
2.5.4. Instructiunea FOR
Sintaxa generala a instructiunii for este urmatoarea:
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.
Exemplul de mai sus produce acelasi rezultat ca si ciclul while discutat mai sus. Se observa ca in acest caz instructiunea este mai compacta, initializarea variabilei si incrementarea se executa intr- o singura instructiune.
La fel ca si in cazul instructiunilor while sau do-while, se poate folosi clauza for pentru a opri executia instructiunii for: <?php for($iCrt=0; $iCrt < 10 ; $iCrt++) { if($iCrt >5) { break; } echo 'Valoare variabilei $iCrt este:'.$iCrt; } ?> In acest caz , in momentul in care variabila $iCrt are valoarea 6 (mai mare ca 5) , executia ciclului for se va stopa.
2.5.5. Instructiunea FOREACH
Aceasta instructiune a fost introdusa pentru a usura manipularea variabilelor de tip array. Sintaxa generala a instructiunii foreach este urmatoarea: foreach(expresie_array as $valoare) { Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Instructiune(1); Instructiune(2); Instructiune(3); ............. } sau: foreach(expresie_array as $key =>$valoare) { Instructiune(1); Instructiune(2); Instructiune(3); ............. } In primul caz pentru fiecare element din array se va asocia valoarea variabilei : $valoare, iar dupa fiecare executie a instructiunilor se va face trecerea la urmatorul element din array.
In cel de-al doilea caz pentru fiecare element din array se va face asocierea cheie-array cu variabila $key si valoare-element-array cu $valoare. <?php $arr = array(0, 1, 2, 3, 4, 5); foreach($arr as $iCrt) { echo 'Elementul current este:'.$iCrt; } ?>
In anumite situatii este util sa aflam perechea cheie=>valoare a fiecarui element din array:
In cazul tablourilor multidimensionale , putem parcurge elementele din array in felul urmator:
<?php $multiDimArray = array("firstLine" => array(1 =>10, 2 => 20, "a" =>"alpha")); $multiDimArray["nextLine"] = array(1 =>20, 2 => 40, "b" =>"beta"); foreach($multiDimArray as $lines) { foreach($lines as $columns) { echo 'Elementul curent este:'. $columns; } } ?> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
2.6. Utilizarea matricelor
Matricele sunt create folosind sintaxa array(). In acest sens notiunile de array si matrice au acelasi inteles. Fiecare element al unei matrici are doua elemente importante: cheia si valoarea elementului. PHP pune la dispozitia utilizatorului un set de functii pentru sortarea matricelor.
Sortarea dupa valoare:
Consideram urmatorul exemplu: <?php $arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan'); echo '<br>Matrice initiala'; foreach($arr as $key=>$nume) { echo '<br>Cheie='.$key.' Valoare='.$nume; } sort($arr); echo '<br>Matrice sortata dupa valoare'; foreach($arr as $key=>$nume) { echo '<br>Cheie='.$key.' Valoare='.$nume; } ?> Codul PHP de mai sus va produce urmatorul rezultat: Matrice initiala Cheie=0 Valoare=Popescu Cheie=1 Valoare=Avram Cheie=5 Valoare=Cristian Cheie=3 Valoare=Dan Matrice sortata dupa valoare 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 (ordine alfabetica). Observam de asemenea ca valorile campului cheie au fost alterate.
Daca dorim sa sortam aceasta matrice in ordine inversa folosim functia arsort() :
<?php $arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan'); echo '<br>Matrice initiala'; foreach($arr as $key=>$nume) { echo '<br>Cheie='.$key.' Valoare='.$nume; } rsort($arr); echo '<br>Matrice sortata dupa valoare'; foreach($arr as $key=>$nume) { Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
echo '<br>Cheie='.$key.' Valoare='.$nume; } ?> Acest cod va produce urmatorul rezultat: Matrice initiala Cheie=0 Valoare=Popescu Cheie=1 Valoare=Avram Cheie=5 Valoare=Cristian Cheie=3 Valoare=Dan Matrice sortata dupa valoare 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() <?php $arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan'); echo '<br>Matrice initiala'; foreach($arr as $key=>$nume) { echo '<br>Cheie='.$key.' Valoare='.$nume; } asort($arr); echo '<br>Matrice sortata dupa valoare'; foreach($arr as $key=>$nume) { echo '<br>Cheie='.$key.' Valoare='.$nume; } ?>
Acest cod va produce urmatorul rezultat: Matrice initiala Cheie=0 Valoare=Popescu Cheie=1 Valoare=Avram Cheie=5 Valoare=Cristian Cheie=3 Valoare=Dan Matrice sortata dupa valoare Cheie=1 Valoare=Avram Cheie=5 Valoare=Cristian Cheie=3 Valoare=Dan Cheie=0 Valoare=Popescu
In anumite situatii este nevoie de a sorta elementele matricei dupa valoarea cheilor. In acest caz folosim functiile ksort(), respective krsort(), care pastreaza corespondenta dintre valori si cheile corespunzatoare: <?php Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Acest cod va produce urmatorul rezultat: Matrice initiala Cheie=0 Valoare=Popescu Cheie=1 Valoare=Avram Cheie=5 Valoare=Cristian Cheie=3 Valoare=Dan Matrice sortata dupa valoare Cheie=0 Valoare=Popescu Cheie=1 Valoare=Avram Cheie=3 Valoare=Dan Cheie=5 Valoare=Cristian
Transformarea sirurilor in matrice si invers: PHP pune la dispozitia utilizatorilor functii pentru conversia dintre siruri si matrice, utile atunci cand valorile matricelor trebuie memorate in baza de date.
Pentru a transforma un sir intr-o matrice folosim functia explode(). Sintaxa aceste functii este: $matrice = explode(' ', $sir);
<?php $sir = 'Popescu Avram Cristian Dan'; $matrice = explode(' ',$sir); foreach($matrice as $key=>$nume) { echo '<br>Cheie='.$key.' Valoare='.$nume; } ?> Acest cod va produce urmatorul rezultat: Cheie=0 Valoare=Popescu Cheie=1 Valoare=Avram Cheie=2 Valoare=Cristian Cheie=3 Valoare=Dan
In continuare, folosind exemplul de mai sus sortam matricea $matrice alfabetic si apoi transferam matricea intr-un alt sir , de aceasta data sortat: <?php Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Acest cod va produce urmatorul rezultat: Cheie=0 Valoare=Popescu Cheie=1 Valoare=Avram Cheie=2 Valoare=Cristian Cheie=3 Valoare=Dan
Sirul rezultat: Avram Cristian Dan Popescu Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Capitolul 3. FUNCTII PHP
CUPRINS Apelarea functiilor care accepta argumente Folosirea functiilor care returneaza o valoare Definirea valorilor implicite ca argumente ale functiei Variabile interne functiilor, domeniul de valabilitate al variabilelor
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: o problema complexa poate fi divizata in mai multe sub-probleme, fiecare astfel de sub-problema fiind 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.
In PHP functiile incep intotdeauna cu declaratia: function, ca in exemplul ca urmeaza:
In exemplul de mai sus am declarat functia makeSum care accepta doi parametrii de tip integer: $a si $b. Functia returneaza de asemenea o valoare de tip integer. Argumentele care se trimit functiei se delimiteaza prin virgula: ,.
Functia din exemplul urmator calculeaza suma elementelor dintr-un array:
<?php /****************************** Function sumArray Parameters: $arr : array Returns: integer ******************************/ Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
function sumArray($arr) { $total=0; foreach($arr as $val) { $total += $val; } return $total; } $arr = array(0=>356,1=>125,2=>543243,3=>12,4=>1643,5=>432,6=>7775); foreach($arr as $cheie=>$val) { echo "<br>Elemenul $cheie Valoare=$val"; } echo " <br>Suma elementelor din array este ".sumArray($arr); ?>
In exemplul de mai sus functia sumArray are un singur parametru de tip array(). In interiorul functiei declaram o variabila locala: $total, care initial are valoarea 0. In continuare cu ajutorul instructiunii foreach parcurgem array-ul: $arr si aduna la valoarea $total valoarea corespunzatoare elemetului curent din array. La final functia va returna valoarea $total care reprezinta de fapt suma elementelor din array.
In anumite situatii este necesar sa modificam continutul variabilelor transmise ca parametru functiei. Consideram exemplul de mai sus in care ne propunem sa modificam valoarea primului element din array cu valoarea rezultata din suma:
<?php /****************************** Function sumArray Parameters: $arr : array Returns: integer ******************************/ function sumArray($arr) { $total=0; foreach($arr as $val) { $total += $val; } $arr[0] = $total; return $total; } $arr = array(0=>356,1=>125,2=>543243,3=>12,4=>1643,5=>432,6=>7775); foreach($arr as $cheie=>$val) { echo "<br>Elemenul $cheie Valoare=$val"; } echo " <br>Suma elementelor din array este ".sumArray($arr); echo " <br>arr[0] = $arr[0]; // va afisa 356 (nemodificat) ?> Se observa ca instructiunea: $arr[0] = $total; introdusa in functia de mai sus nu a modificat valoarea finala a variabilei $arr[0] din tablou. Acest lucru se datoreaza faptului ca in PHP, in mod Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
implicit, argumentele functiei sunt transmise prin valoare. Cu alte cuvinte atunci cand transmitem o variabila unei functii, interpretorul PHP va realiza o copie a acestei variabile si va transmite valoarea acesteia din urma functiei.
O alta modalitate de a transmite valori(variabile) unei functii este prin referinta. In acest caz interpretorul de PHP nu mai realizeaza nici o copie a variabilei, in schimb se transmite functiei adresa din memorie a variabilei ca parametru:
<?php /****************************** Function sumArray Parameters: &$arr : referinta la array Returns: integer ******************************/ function sumArray(&$arr) { $total=0; foreach($arr as $val) { $total += $val; } $arr[0] = $total; return $total; } $arr = array(0=>356,1=>125,2=>543243,3=>12,4=>1643,5=>432,6=>7775); foreach($arr as $cheie=>$val) { echo "<br>Elemenul $cheie Valoare=$val"; } echo " <br>Suma elementelor din array este ".sumArray($arr); echo " <br>arr[0] = $arr[0]; // va afisa 553586 (modificat) ?>
In exemplul de mai sus argumentul functiei este &$arr, care specifica ca argumentul functiei se transmite prin referinta. In acest caz instructiunea: $arr[0] = $total; va modifica continutul final al elementului $arr[0] . Transmiterea argumentelor prin referinta se recomanda in cazul utilizarii ca argumente a tablourilor cu multe elemente sau al sirurilor continand multe caractere. Folosind transmiterea argumentelor prin referinta, codul se va executa mai rapid deoarece in cazul unui tablou, se va transmite doar adresa de memorie unde incepe tabloul in memorie(memorat pe 32 biti) in schimbul transmiterii intregului tablou de valori.
In cazul transmiterii mai multor parametri, este posibil sa specificam anumite valori implicite pentru unele din argumentele functiei: <?php /****************************** Function cafeaFavorita Parameters: $type: string Returns: nothing ******************************/ function cafeaFavorita($type="espresso") { Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
echo "<br>Cafeaua mea favorita este $type"; } echo cafeaFavorita(); // afiseaza Cafeaua mea favorita este espresso echo cafeaFavorita("capuccino"); // afiseaza Cafeaua mea favorita este capuccino ?>
In exemplul de mai sus instructiunea : Echo cafeaFavorita(); nu are specificat nici un argument, in acest caz PHP va folosi valoarea implicita a parametrului ( in cazul nostru espresso).
In toate cazurile in care se specifica argumente implicite pentru parametrii unei functii trebuie tinut cont de faptul ca argumentele cu valorile implicite trebuie plasate la sfarsitul listei de parametrii. Exemplul urmator este eronat deoarece dupa parametrul cu valoare implicita urmeaza un alt argument fara valoare implicita:
<?php /****************************** Function cafeaFavorita Parameters: $type: string Returns: nothing ******************************/ function cafeaFavorita( $type="espresso",$producator) { echo "<br>Cafeaua mea favorita este $type producator $producator"; } echo cafeaFavorita("BRANCO SRL"); // nu creeaza rezultatul asteptat ?> Daca schimbam ordinea parametrilor in exemplul de mai sus functia : cafeaFavorita va functiona conform asteptarilor.
Functiile PHP pot returna o valoare sau rezultatul unei expresii. In exemplul urmator cream functia ridicareLaPatrat care returneaza valoarea argumentului ridicat la patrat:
<?php /****************************** Function ridicareLaPatrat Paramteres: $a: integer Returns: integer ******************************/ function ridicareLaPatrat ( $a) { return $a * $a; } $a = 12; echo "$a la patrat egal cu ". ridicareLaPatrat($a); ?>
Functiile pot returna in principiu orice fel de valori, inclusiv valori de tio array, object, sau valori de tip referinta.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Capitolul 4. PHP SI FORMULARELE HTML
4.1. Crearea unui formular
Formularele se creaza folosind eticheta <form> ca in exemplul de mai jos: <form action="test5.php" method="GET"> Nume:<input type="text" name="nume"> </form>
Fiecare element al formularului trebuie introdus intre etichetele <form> si </form>. Atributul action indica serverului scriptul care va primi datele de la formular si reprezinta una dintre cele mai importante precizari.
4.2. Utilizarea metodelor GET si POST
Atributul method poate avea doua valori: GET si POST. Diferenta intre metodele GET si POT consta in modul in care informatia din formular este transmisa scriptului care o prelucreaza. Metoda GET trimite toate informatiile adunate ca parte a adresei URL; aceste informatii sunt vizibile pentru utilizator. Metoda POST transmite informatia intr-o maniera invizibila pentru utilizator.
Folosind exemplul de formular de mai sus, metoda GET va transmite serverului o adresa ca mai jos: http://www.MySite.ro/test5.php?nume=Popescu iar in cazul folosirii metodei POST: http://www.MySite.ro/test5.php
Metoda GET permite transmiterea unui volum limitat de informatii catre server; de asemenea nu este recomandata folosirea acestei metode in cazul in care dorim sa transmitem date personale (de exemplu parolele introduse intr-un formular pot fi vizualizate de oricine in browser).
Pentru a introduce butoane de tip radio intr-un formular PHP se foloseste eticheta: <input type=radio> , ca in exemplul de mai jos: <form action="test5.php" method="GET"> Nume:<input type="text" name="nume"> Ocupatia: <br>Elev< input type="radio" name="ocupatie" value="Elev"> <br>Student< input type="radio" name="ocupatie" value="Student"> <br>Profesor< input type="radio" name="ocupatie" value="Profesor"> </form>
Pentru a introduce un meniu de selectie intr-un formular se foloseste eticheta <select></select> , ca in exemplul de mai jos:
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
In exemplul de mai sus denumirile oraselor sunt pastrate in tabloul: $orase. Am folosit instuctiunea foreach pentru a parcurge fiecare element din tablou si a crea o intrare in combobox.
Pentru trimiterea datelor din formular catre un script de pe server vom folosi o intrare speciala de tip submit: <input type=submit>, ca in exemplul de mai jos: <form action="test5.php" method="GET"> Nume:<input type="text" name="nume"><br> Adresa email:<input type="text" name="email"><br> <br> Ocupatia: <br>Elev< input type="radio" name="ocupatie" value="Elev"> <br>Student< input type="radio" name="ocupatie" value="Student"> <br>Profesor< input type="radio" name="ocupatie" value="Profesor"> <br><input type = ="submit" name="submit" value="Trmite formular"> </form> In momentul in care user-ul va actiona butonul submit datele din formular vor fi trimise catre scriptul test5.php.
4.3. Receptionarea datelor de la un formular HTML
In cele mai multe versiuni de PHP valorile din formular sunt accesibile prin preluarea atributului name al diferitelor date de intrare si adaugarea semnului $ pentru a se crea variabila corespunzatoare.
Folosind formularul de mai sus , in scriptul test5.php , vom accesa variabilele: $nume contine informatia introdusa in campul nume $email contine informatia introdusa in campul Adresa email $ocupatie contine informatia introdusa in butoanele radio Ocupatia
Deoarece cunoastem metoda prin care trimitem datele catre scriptul PHP, putem folosi variabila PHP globala _GET sau _POST pentru a receptiona datele din formular: _GET['nume'] _GET[' email'] _GET[' ocupatie'] Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Variabile PHP globale: _GET si _POST reprezinta de fapt variabile de tip array, fiecare element se poate accesa prin cheia sa; in cazul nostru cheia este data de atributul : name din formular.
Aceasta pagina HTML va genera un formular ca mai jos:
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Introducem in continuare secventa care va prelua datele din formular(test2.php). In cazul in care Name=Ion si Password=computer scriptul va afisa : <br>Salut Ion .Autentificare realizata' ; In alte cazuri scriptul va afisa : Nume sau parola incorecte<br>Incercati din nou <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> <body> <?php if(isset($_POST)) { if($_POST['name'] == 'Ion' && $_POST['password']== 'computer') { echo '<br>Salut'.$_POST['name'].'<br>Autentificare realizata'; die; } else echo '<br>Nume sau parola incorecte<br>Incercati din nou'; } } ?> <form action="test2.php" method="POST"> <table summary="" bgcolor="#808080"> <tr> <td> <table cellpadding="1" cellspacing="1" border="0"> <caption><font color="#3399ff" size="4">User authentification</font></caption> <tr align="right"> <td align="right">Name</td> <td><input type="text" size="25" name="name"></td> </tr> <tr align="right"> <td>Password</td><td><input type="password" size="25" name="password"></td> </tr> <tr><td colspan="2" align="center"><input type="submit" value="Logon"></td></tr> <tr><td colspan="2" align="center"><a href="autentif.php">New user?</a></tr> </table> </td> </tr> </table> </form> </body> </html> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Scriptul PHP de mai sus se executa doar daca functia isset($_POST) returneaza TRUE. Functia isset() returneaza FALSE daca variabila transmisa ca parametru este neinitializata(are valoarea NULL); in caz contrar returneaza valoarea TRUE.
4.4. Tratarea erorilor
Modulul PHP poate fi configurat astfel incat sa afiseze erorile intalnite 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 ".$_GET['orase']; ?>
In exemplul de mai sus daca variabila cu nume : orase nu exista PHP va afisa un mesaj de eroare de genul: Notice: Undefined variable: "._GET['orase']
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. Functia 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.
Consideram un formular care afiseaza informatii despre utilizator: Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
-nume -judet -oras
Intrarile judet si oras sunt introduse intr-un meniu <select>. Campurile judet si oras sunt pastrate intr-un tablou bidimensional. Sa se modifice scriptul de mai jos astfel incat la selectarea unui anumit judet, in combobox-ul orase sa fie incarcate orasele corespunzatoare.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Capitolul 5. FISIERE SI DIRECTOARE
5.1. Crearea, scrierea fisierelor
Pentru a crea un fisier nou pe un server sunt necesari trei pasi: -deschiderea fisierului in mod scriere -scrierea efectiva a datelor in fisier -inchiderea fisierului.
In PHP aceste lucruri se realizeaza ca in secventa de mai jos: <?php ini_set('display_errors',1); error_reporting(E_ALL & ~E_NOTICE ); $fp = fopen('numeFisier', 'mod'); fwite($fp, 'date de scris'); fclose($fp); ?>
Instructiunea fopen deschide fisierul cu numele 'numeFisier', in modul specificat de 'mod'. Functia returneaza o variabila de tip pointer catre fisier: $fp (file pointer).
Modurile de deschidere a unui fisier sunt urmatoarele:
Mod Descriere 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
In continuare prezentam o secventa de cod care preia datele dintr-un formular si apoi scrie aceste date intr-un fisier pe server: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
<body> <?php ini_set('display_errors',1); error_reporting(E_ALL & ~E_NOTICE); if(isset($_POST['submit'])) { if(!empty($_POST['adnotari'])) { $fp = fopen('..\date.txt','wb'); if($fp) { $date = $_POST['adnotari']."\r\n"; $dateLen = fwrite($fp,$date); fclose($fp); if($dateLen==0) { echo "Nu pot scrie date in fisierul ..\date.txt"; } else { echo "Datele transmise au fost scrise in fisierul ..\date.txt"; } } else { echo "Nu pot deschide fisierul ..\date.txt la scriere"; } } } ?> <form action="scriu_fis.php" method="POST"> Introduceti textul pentru scriere in fisier pe server:<br><br> <textarea name="adnotari" rows="5" cols="20"></textarea><br><br> <input type="submit" name="submit" value="Submit text"> </form> </body> </html>
Datele sunt preluate intr-un formular folosind eticheta <textarea>. Se observa ca instructiunea fopen creaza un fisier daca acesta nu exista ; in cazul in care exista va altera vechiul continut al fisierului.
5.2. Blocarea fisierelor
Secventa de cod descrisa mai sus poate creea probleme in cazul in care, de exemplu doi utilizatori diferiti acceseaza acelasi fisier, in acelasi timp.
Pentru a evita stfel de conflicte PHP pune la dispozitia utilizatorilor o metoda prin care se poate bloca accesul temporar la un fisier. Pe durata blocarii , un alt utilizator nu va mai putea scrie/citi din acest fisier. De aceea durata blocarii trebuie sa fie limitata, in cazul nostru vom bloca fisierul dor pe durata scrierii in fisier.
Functia care realizeaza blocarea este: Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Flock($fp, modBlocare);
Unde fp este un pointer catre fisier asa cum am discutat in exemplul de mai sus.
Parametrul modBlocare poate avea urmatoarele valori: Mod blocare Descriere LOCK_SH Blocare partajata in scopuri de citire LOCK_EX Blocare exclusiva in scopuri de scriere LOCK_UN Eliminarea blocarii LOCK_NB Blocare fara fixare
Vom modifica secventa de scriere de mai sus dupa cum urmeaza:
In acest caz codul PHP de preluare a datelor din formular si scriere in fisier , se va modifica ca mai jos:
<?php ini_set('display_errors',1); error_reporting(E_ALL & ~E_NOTICE); if(isset($_POST['submit'])) { if(!empty($_POST['adnotari'])) { $fp = fopen('..\date.txt','wb'); if($fp) { $date = $_POST['adnotari']."\r\n"; flock($fp, LOCK_EX); $dateLen = fwrite($fp,$date); flock($fp, LOCK_UN); fclose($fp); if($dateLen==0) { echo "Nu pot scrie date in fisierul ..\date.txt"; } else { echo "Datele transmise au fost scrise in fisierul ..\date.txt"; } } else { echo "Nu pot deschide fisierul ..\date.txt la scriere"; } Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
} } ?>
5.3. Citirea fisierelor
Ne propunem sa cream un script PHP care sa citesca datele pe care le-am scris anterior in fisierul: ..\date.txt . O metoda simpla pentru a realiza acest lucru este folosind functia : file.
Functia file(numeFisier) returneaza un array, fiecare element din array reprezinta de fapt o linie de text introdusa in formular.Acest lucru este ilustrat in scriptul urmator: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> <body> <?php //Preluarea datelor dintr-un fisier text if(file_exists('..\date.txt')) { $arr = file('..\date.txt'); if(count($arr) >0) { echo "<br>Datele din fisierul ..\date.txt sunt:<br> "; foreach($arr as $linie) { echo $linie; } } } else { echo "Fisierul ..\date.txt nu exista"; } ?> </body> </html> In exemplul de mai sus functia file_exists returneaza true daca fisierul exista; functia file returneaza in variabila $arr continutul fisierului. Am folosit instructiunea foreach pentru a parcurge array-ul $arr si a afisa toate liniile din fisier.
In anumite situatii avem nevoie sa accesam doar anumite informatii dintr-un fisier, in acest scop fom folosi instructiuni pentru parcurgerea secventiala a fisierului.
Pentru acest lucru consideram un exemplu in care avem un formular de logare care contine campurile Nume, Parola, Confirmare parola. Ne propunem sa trimitem aceste date la un script care sa preia aceste date si sa le adauge la un fisier de pe server: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
<title>Untitled</title> </head> <body> <?php if(isset($_POST['submit'])) { if(empty($_POST['nume']) || empty($_POST['parola1'])) { echo "Nume sau parola necompletate"; } else { if($_POST['parola2'] !=$_POST['parola1']) { echo "Campurile parola si confirmare parola diferite"; } else if($fp = fopen('..\userData.txt','a+b')){ $date = $_POST['nume']."\t"; $date .= crypt($_POST['parola1'])."\r\n"; $dateLen = fwrite($fp,$date); fclose($fp); if($dateLen >0 ) { echo "Date au fost adaugate cu success"; } } } }
Scriptul : scriu_pers.php transmte mesaje de eroare daca Campurile Nume sau Parola sunt vide, sau daca Campurile Parola si Confirmare paraola sunt diferite. Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Daca totul este OK se foloseste functia : fopen('..\userData.txt','a+b')) care creeaza fisierul ..\userData.txt daca acesta nu a existat apriori. Daca acesta a existat deschide fisierul fara a altera datele existente. Functia fwrite, adauga date la sfarsitul fisierului deoarece fisierul a fost deschis in modul adaugare: a+b.
Am folosit functia crypt care cripteaza un sir de caractere.
In continuare ne propunem sa folosim form-ul precedent , dar de acesta data pentru a verifica daca Numele si parola exista inregistrate in fisierul: ..\userData.txt. Pentru aceasta vom parcurge fisierul secvential, linie cu linie, vom identifica Campurile Nume si parola si le vom compara cu cele transmise de formular: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> <body> <?php if(isset($_POST['submit'])) { $logOK=FALSE; if(empty($_POST['nume']) || empty($_POST['parola1'])) { echo "Nume sau parola necompletate"; } else if($fp = fopen('..\userData.txt','rb')){ while($linie = fgets($fp,1024)) { $arr = explode("\t",$linie); $varCript = crypt($_POST['parola1'],$arr[1]); if(((($_POST['nume'] == $arr[0]) && strncmp($varCript,$arr[1],34)==0) { $logOK = TRUE; break; } } fclose($fp); } if($logOK) echo "Logare cu success"; else echo "Nume sau parola inexistente"; } ?> <form action="citesc_pers.php" method="POST"> <table summary="" bgcolor="#808080"> <caption>Autentificare utilizator</caption> <tr><td> <table summary="" border="0"> <tr><td>Nume:</td><td><input type="text" size='15' name='nume'></td></tr> <tr> <td>Parola:</td><td><input type="password" size='20' name='parola1'></td> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
In PHP comanda pentru crearea unui director este: mkdir(nume_director, permisiuni);
In aceasta functie nume_director reprezinta calea spre un director; ea se poate specifica folosind calea absoluta sau relativa.
In cazul in care avem un server Windows , al doilea parametru poate fi ignorat; specificarea permisiunilor nu este obligatorie. In cazul serverelor Unix, permisiunea implicita este, 077, care atribuie drepturi de scriere , citire si executare utilizatorilor: owner, Group si Others.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> <body> <?php //Exemplu de folosire a functiei mkdir if(mkdir("..\myDir")) echo "Directorul ..\myDir a fost creat"; else echo "Nu pot creea Directorul ..\myDir "; ?> </body> </html>
Exemplul de mai sus creeaza un director ..\myDir sub directorul Web curent : InetPub\wwwRoot\. Directorul nou creat va fi: c:\ InetPub\myDir
Pentru a parcurge intrarile care se afla intr-un director dat , se folosesc functiile: opendir, readdir si respectiv closedir.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Functia: opendir(nume_director) deschide directorul specificat pentru citire; ea intoarce valoarea NULL daca directorul specificat nu exista. Daca directorul exista ea returneaza o variabila de tip pointer spre director: $dp (directory pointer).
Functia readdir($dp) citeste urmatoarea intrare din directorul a carui pointer este specificat ca parametru. Pentru a afla daca o intrare reprezinta un fisier se poate folosi functia : is_file(nume_intrare); care intoarce true daca intrarea curenta este un fisier.
Functia is_dir(nume_intrare) returneaza valoarea TRUE daca intrarea curenta este un director.
In continuare prezentam un exemplu in care afisam toate intrarile dintr-un director; mai intai directoarele apoi fisierele: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> <body> <?php parcurge_director("."); function parcurge_director($nume_dir) { if(!empty($nume_dir)) { $dp = opendir($nume_dir); if($dp) { echo "<table>"; echo"<tr><td>Nume</td><td>Lungime(bytes)</td>"; echo "<td>Ultima modificare</td></tr>"; while($intrare = readdir($dp)) { if(is_dir($intrare)) { echo <tr><td>$intrare</td><td></td><td>"; echo date('d/m/y',filemtime($intrare))."</td>"; } } rewinddir($dp); while($intrare = readdir($dp)) { if(is_file($intrare)) { echo "<tr><td>$intrare</td><td>".filesize($intrare); echo "</td><td>".date('d/m/y',filemtime($intrare))."</td>"; } } } echo "</table>"; } } ?> </body> </html> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Functia rewinddir($dp) aduce pointerul de director la inceputul intrarilor din director; in continuare functia readdir va citi din nou prima intrare din director.
5.5. Drepturi de access la fisiere
Din punctul de vedere al programatorului PHP , cele mai importante drepturi de access la fisiere sau directoare sunt: read, write si execute(sau search in cazul directoarelor).
Aceste drepturi pot fi acordate de catre administrator, urmatoarelor tipuri de utilizatori: -owner , persoana care l-a creat sau care l-a plasat pe server -group , membrii unui grup stabilit de administrator -others, ceilalti utilizatori care nu fac parte din categoriile de mai sus.
In cele mai uzuale cazuri proprietarul: owner are drepturi de citire/scriere asupra fisierului creat, utilizatorii group si others primind doar drepturi de citire.
Datorita faptului ca exista posibilitatea scrierii intr-un fisier sau director pe server, acest lucru implica luarea unor masuri de precautie in ce priveste securitatea sistemului. O masura de securitate care se foloseste este plasarea fisierelor/directoarelor in care se poate scrie, in afara directoarelor Web . In cazul nostru daca directorul Web este: c:\InetPub\wwwroot\Sites, atunci daca se plaseaza fisiere/directoare in c:\InetPub , acestea vor fi accesibile doar motorului PHP care ruleaza local , nu si altor persoane, prin Internet.
Cele mai multe sisteme de operare au un utilizator PHP, care este de fapt utilizatorul aplicatiei WebServer( Apache, IIS, PWS). In sistemele de operare compatibile Unix, serverul Apache ruleaza sub utilizatorul Nobody. In serverele Windows aplicatia server IIS ruleaza cu aceleasi drepturi ca utilizatorul conectat. In acest din urma caz nu este nevoie sa schimbam atributele fisierelor in care scriem/citim.
PHP are cateva functii pentru modificarea permisiunilor asupra fisierelor si anume: chgrp(), chown() si chmod(). Acestea reprezinta operatii de modificare a grupului, proprietarului sau atributelor fisierelor. Aceste functii actioneaza doar in cazul in care modulul PHP are drepturi de modificare a fisierelor/directoarelor specificate.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Capitolul 6. SITE-URI DINAMICE, LUCRUL CU BAZELE DE DATE
6.1. Conectarea la serverul MySQL; tratarea erorilor
Faptul ca de-a lungul timpului, limbajul PHP a devenit atat de popular se datoreaza in mare masura faptului ca acesta contine suport de functii pentru accesarea informatiilor din bazele de date. Pentru a utiliza o baza de date MySQL, avem nevoie de o conexiune la serverul de baze de date(in cazul nostru , serverul MySQL). Aceasta conexiune va fi utilizata ulteruior ca punct de access pentru comenzi mysql.
Primul parametru: localhost, reprezinta gazda pe care ruleaza serverul MySQL. In cazul in care serverul MySQL ruleaza pe acelasi computer ca si modulul PHP, acest parametru este localhost. In alte cazuri, daca serverul MySQL ruleaza pe un alt computer, va trebui sa specificati adresa computerului pe care ruleaza serverul MySQL.
Parametrii , userName, password , vor fi inlocuiti cu numele utilizatorului care se conecteaza la serverul MySQL, respectiv parola.
O varianta a functiei de conectare mysql_connect este functia de conectare permanenta: mysql_pconnect. Aceasta functie se apeleaza in mod similar cu functia mysql_connect, dar se deosebeste de aceasta prin urmatoarele: -conexiunea la serverul MySQL nu se inchide odata cu terminarea scriptului PHP curent. In schimb PHP conexiunea ramane deschisa pentru a putea fi utilizata ulterior. - la apelare, acesta functie va incerca sa gaseasca o conexiune anterioara provenita de la acelasi host, userName si password. Daca exista o astfel de conexiune anterioara, va fi folosita aceasta conexiune, daca nu se va deschide una noua.
Pentru terminara unei conexiuni la serverul MySQL se foloseste instructiunea: mysql_close();
Aceasta functie inchide conexiunea curenta (variabila $hDb nu mai este valida). Aceasta functie nu inchide conexiunea in cazul initializarii conexiunii cu mysql_pconnect.
In anumite situatii folosirea functiei mysql_connect poate avea un efect benefic asupra performantelor scriptului PHP; aceasta datorita faptului ca operatia de conectare/deconectare consuma un interval de timp.
Pentru a ne conecta avem nevoie de un nume si o parola. In cazul serverelor de productie, acest lucru este furnizat de administratorul serverului. In cazul in care va conectati pe calculatorul dvs. personal, puteti creea un nou utilizator parcurgand urmatoarele etape:
1.deschideti o consola MySQL conectindu-va cu drepturi de root: mysql u root p Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
2.creati o baza de date de test : create database magazinCD; 3.creati un nou utilizator: grant INSERT,UPDATE,DELETE,ALTER,CREATE on magazinCD.* to webUser@localhost IDENTIFIED BY computer;
Consideram exemplul urmator in care incercam sa realizam o conexiune la serverul MySQL: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Conectare la severul MySQL</title> </head> <body> <?php //Script de conectare la serverul MySQL $hDb = mysql_connect('localhost','webUser', 'computer'); if($hDb) { echo "Conectare reusita la serverul MySQL"; } else { die("Conectare esuata".mysql_error()); } mysql_close(); ?> </body> </html>
In exemplul de mai sus , daca conectarea a reusit( variabila $hDb nu este nula), se trimite la iesire sirul: "Conectare reusita la serverul MySQL";
In cazul in care conectarea nu reuseste(variabila $hDb este nula), se trimite la iesire sirul: Conectare esuata concatenat cu rezultatul functiei mysql_error(). Aceasta functie returneaza un sir care descrie eroarea . Nu folositi aceasta functie in cazul site-urilor reale de productie, deoarece ar putea furniza informatii utile pentru un attacher. Folositi mysql_error() doar pentru depanarea scripturilor PHP.
De asemenea in anumite situatii reale este util sa oprim mesajele de eroare pe care le-ar genera functia mysql_connect. Putem face acest lucru adaugand un semn @ inaintea functiei. In acest caz scriptul de mai sus va fi:
<?php //Script de conectare la serverul MySQL if($hDb = @mysql_connect('localhost','webuser', 'computer')) { echo "Conectare reusita la serverul MySQL"; } else { die("Conectare esuata deoarece: ".mysql_error()); } mysql_close(); Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
?>
6.2. Crearea si selectarea unei baze de date
Pentru a crea o noua baza de date folosim comanda SQL:
create databse numeBazaDeDate;
pe care o putem lansa de la o consola MySQL, sau o putem apela de la un script PHP.
Aceasta comanda va functiona doar daca aveti suficiente drepturi pentru a creea base de date. In cazul lansarii comenzii de la consola , va trebui sa va logati ca user cu drepturi de creare baze de date. De asemenea in cazul scripturilor PHP, la conectare trebuie sa specificati un user cu drepturi de creare baze de date.
In exemplul urmator cream o conexiune ca utilizator root, si apoi cream o baza de date cu numele magazinCD: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title> Creearea unei baze de date MySQL </title> </head> <body> <?php //Script pentru creearea unei baze de date MySQL $hDb = mysql_connect('localhost','root', 'mypassword'); if($hDb) { if(mysql_query(CREATE DATABASE magazincd)) { echo Baza de date : magazincd a fost creata; } else { die(Nu pot creea B.D. magazincd deoarece:.mysql_error()); } } else { die("Conectare esuata".mysql_error()); } mysql_close(); ?> </body> </html> In exemplul de mai sus am folosit instructiunea: mysql_query(); care executa o comanda SQL valida. In cazul nostru comanda SQL este: CREATE DATABASE magazinCD In cazul in care operatia esueaza, functia intoarce valoarea NULL. Functia die(), afiseaza sirul prezentat ca parametru, dupa care opreste executia scriptului curent. Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Pentru a selecta o baza de date deja existenta folosim instructiunea:
mysql_select_db(numeBazaDeDate);
Aceasta functie returneaza valoarea true daca baza de date specificata ca parametru a fost selectata; returneaza false in cazul in care baza de date nu a putut fi selectata( in general datorita faptului ca ea nu exista).
Exemplul urmator ilustreaza acest lucru: <?php //Script pentru conectare + selectare baza de date MySQL $hDb = mysql_connect('localhost','webuser', 'computer'); if($hDb) { if(mysql_select_db(magazincd)) { echo Baza de date : magazincd a fost selectata; } else { die(Nu pot selecta B.D. magazincd deoarece:.mysql_error()); } } else { die("Conectare esuata".mysql_error()); } mysql_close(); ?>
In cazul unui site real de productie , creati urmatorul script:
<?php //////////////////////////////////////////////////////////////////// // dbconnect.php //Script pentru conectare + selectare baza de date MySQL //////////////////////////////////////////////////////////////////// if($hDb = mysql_connect('localhost','webuser', 'computer')) { if(!mysql_select_db(magazincd, $hDb)) { die(Nu pot selecta baza de date); } } else { die("Conectare esuata"); } ?> Salvati acest fisier sub numele de dbconnect.php intr-un director cu un nivel mai sus decat cel in care se afla paginile Web. Acest fisier contine informatii importante si de aceea trebuie evitate posibilitatile prin care utilizatori rau intentionati ar putea citi acest fisier.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
In cazul in care interpretorul PHP nu mai functioneaza, fisierele PHP nu vor mai fi interpretate, ci va fi afisat codul sursa al acestor. De aceea acest fisier trebuie plasat cu unu sau doua niveluri mai sus in ierarhia de directoare.
Deoarece acest script va fi apelat frecvent, PHP pune la dispozitie directiva
include(numeFisierPHP);
care va insera in scriptul curent continutul fisierului specificat ca parametru.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title> exedmplu MySQL </title> </head> <body> <?php //Include scriptul de conectare include(../dbconnect.php); ?> </body> </html>
6.3. Crearea tabelelor, scripturi SQL
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,....);
In exemplul urmator cream tabelul cu numele Albume care contine urmatoarele campuri:
Nume camp Tip id Identificator unic, nenull, cheie primara Nume Char(30) Autor Char(25) Gen Char(10) DataIntrarii Date Pret Decimal(13,2)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> <body> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
<?php include ("../dbconnect.php"); $SQL = "CREATE TABLE Albume (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,"; $SQL .= "Nume varchar(30) NOT NULL, Autor varchar(25) , Gen varchar(10) NOT NULL,"; $SQL .= "DataIntrarii date, Pret decimal(13,2))"; if(mysql_query($SQL)) { echo "Tabelul : magazincd a fost creat"; } else { echo "Nu pot creea tabelul magazincd deoarece:".mysql_error(); echo "<br>$SQL"; } ?> </body> </html>
In exemplul de mai sus , variabila $SQL contine comanda SQL pentru crearea unui tabel. Se observa ca in parametrii comenzii sunt incluse campurile din tabela.
Instructiunea mysql_query, executa aceasta comanda si in cazul in care rezultatul nu este Null se trimite la iesire sirul: Tabelul: magazincd a fost creat. In cazul in care instructiunea SQL nu a putut fi executata functia mysql_query intoarce valoarea NULL.
Pentru crearea tabelelor se pot folosi de asemenea fisiere script. Acestea din urma au extensia .sql , si contin instructiuni SQL .
Consideram fisierul creare_tabele.sql cu urmatorul continut: # Nume fisier: creare_tabele.sql # Use this schema for creating your database for # a new installation of webProject.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Dupa cum se observa acest fisier contine comenzi pentru crearea a doua tabele: judete si localitati. Pentru a executa acest fisier script deschidem o consola MySQL si executam comanda: source creare_tabele.sql; care va lansa in executie acest script si va creea cele doua tabele. De asemenea in acest script pot fi inserate orice comenzi valide SQL.
6.4. Adaugarea, inserarea datelor intr-o tabela
n continuare vom considera baza de date : magazincd, si vom incerca sa creea un form HTML din care sa preluam date si sa le inseram in tabela : Albume.
Pentru aceasta creeam mai intai un formular HTML, cu urmatoarele campuri: -Nume (numele albumului) -Autor (autorul piesei muzicale) -Genul (rock, pop, blues, country,etc..) -DataIntrarii (data in care a fost receptional CD-ul) -Pret(pretul de vinzare)
Codul HTML pentru acest formular va fi ca cel din exemplul de mai jos: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Adaugare CD-uri</title> </head> <body> <form action="adaug_cd.php" method="POST"> <CENTER> <table summary="" border="0" bgcolor="#808080"> <tr><td> <table summary="" border="0"> <caption >Preluare CD-uri</caption> <tr> <td>Nume</td><td><input type="text" size='30' name='nume'></td> </tr> <tr> <td>Autor</td><td><input type="text" size='25' name='autor'></td> </tr> <tr> <td>Gen</td> <td><select name="gen"> <option value="rock">rock</option> <option value="rock">pop</option> <option value="rock">country</option> <option value="rock">blues</option> </select> </td> </tr> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
<tr> <td>Pret</td><td><input type="text" size='13' name='pret'></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" name='submit' value='Trimite'></td> </tr> </table> </td></tr> </table> </CENTER> </form> </body> </html> Se observa ca datele din formular vor fi trimise catre scriptul : adaug_cd.php.
In continuare cream scriptul adaug_cd.php ca mai jos: <?php //conectare la baza de date include ("../dbconnect.php"); if(isset($_POST['submit'])) { $SQL = "INSERT INTO Albume (Nume, Autor, Gen, DataIntrarii, Pret) "; $SQL .="VALUES('{$_POST['nume']}','{$_POST['autor']}','{$_POST['gen']}','"; $SQL .=date('Y-m-d')."',{$_POST['pret']})"; if(mysql_query($SQL)) { echo "Datele au fost adaugate la tabela"; } else { echo "Eroare SQL".mysql_error(); } } ?>
Se observa folosirea instructiunii SQL: INSERT INTO numeTabela (cimp1,cimp2,cimp3,...) VALUES( Valoare1,Valoare2,Valoare3,...);
Ca si in alte cazuri folosim instructiunea mysql_query pentru a executa aceasta comanda SQL.
6.5. Citirea datelor dintr-o tabela sau interogare
In continuare ne propunem sa citim datele din tabela Albume, si sa le afisam apoi intr-un tabel HTML. Pentru aceasta folosim comanda SQL SELECT , care realizeaza interogarea inregistrarilor dintr-o tabela:
SELECT camp1, camp2, camp3,... FROM numeTabela WHERE clausa
Vom executa aceasta comanda SQL cu ajutorul instructiunii mysql_query:
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
$result = mysql_query(comanda SQL);
In acest caz variabila $result contine un indicator catre inregistrarile interogarii. Pentru a parcurge inregistrarile linie cu linie folosim instructiunea:
$row = mysql_fetch_array($result);
Aceasta instructiune intoarce in variabila $row un array care contine ca elemente campurile returnate de interogarea SQL.
Urmatorul exemplu citeste interogarile din tabela Albume si le afiseaza sub forma tabelara: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Listare CD-uri</title> </head> <body> <?php //conectare la baza de date include ("../dbconnect.php"); $SQL = "SELECT * FROM Albume;"; if($res = mysql_query($SQL)) { //Afisare cap de tabel echo "<table summary='' border='1'>"; echo "<caption>Lista CD-uri</caption>"; echo "<tr bgcolor='#00ffff'>"; echo"<td>Nume</td><td>Autor</td><td>Gen</td><td>Data</td><td>Pret</td>"; echo "</tr>"; //Parcurgere inregistrari while($row = mysql_fetch_array($res)) { echo "<tr><td>{$row['Nume']}</td>"; echo "<td>{$row['Autor']}</td>"; echo "<td>{$row['Gen']}</td>"; echo "<td>{$row['DataIntrarii']}</td>"; echo "<td align='right'>{$row['Pret']}</td>"; echo "</tr>"; } echo "</table>"; } else { echo mysql_error(); } ?> </body> </html>
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
vom considera baza de date: magazincd, si vom incerca sa creea un form HTML din care sa preluam date si sa le inseram in tabela : Albume.
6.5. Citirea datelor dintr-o tabela sau interogare
Pentru a sterge inregistrari dintr-o tabela folosim comanda SQL DELETE:
DELETE FROM numeTabel WHERE clausa;
Consideram exemplul de mai sus in care vom adauga un camp numit Delete la tabelul existent. In celulele corespunzatoare vom adauga Butoane pentru stergere. In momentul in care se face click pe un buton, se apeleaza functia JavaScript: deleteCD cu parametrul egal cu numarul de identificare a inregistrarii din tabela (campul id).
In continuare se apeleaza: this.document.forms.stergForm.submit();
pentru a trimite datele catre script. Exemplul urmator ilustreaza acest lucru: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Sterge CD-uri</title> </head> <body> <form action="sterge_cd.php" method="POST" name='stergForm'> <?php //conectare la baza de date include ("../dbconnect.php"); // Sterge inregistrarea din tabela if(isset($_POST['rowDel'])) { $SQL = "DELETE FROM Albume where id =".$_POST['rowDel']; if($res = mysql_query($SQL)) { echo "Delete succesfull"; } } $SQL = "SELECT * FROM Albume;"; if($res = mysql_query($SQL)) { //Afisare cap de tabel echo "<table summary='' border='1'>"; echo "<caption>Lista CD-uri</caption>"; echo "<tr bgcolor='#00ffff'>"; echo "<td>Nume</td><td>Autor</td><td>Gen</td><td>Data</td><td>Pret</td><td><Sterge></td>"; echo "</tr>"; Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Sesiunea reprezinta o modalitate prin care modulul PHP retine informatii de la o pagina la alta. Odata cu initializarea unei sesiuni, utilizatorul poate pastra anumite variabile chiar daca in continuare se viziteaza si alte pagini ale site-ului. In principiu informatia se pastreaza pana la inchiderea browser-ului, sau pana cand utilizatorul distruge in mod explicit sesiunea curenta. Intern lucrurile se desfasoara ca in exemplul urmator: in momentul cand un user s-a logat la site- ul dumneavoastra, PHP atribuie acestuia un identificator unic de sesiune : SID.
Acest SID este inglobat intr-un coockie cu numele PHPSESSID si trimis apoi catre browserul utilizatorului. Daca browserul nu suporta cookie-uri sau acestea sunt dezactivate, atunci acest SID este adaugat la adresa URL. In acelasi timp se creeaza un fisier cu numele SID se creeaza pe server. In continuare daca utilizatorul doreste sa stocheze anumite informatii, aceste vor fi practic scrise in acest fisier SID de pe server. Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Folosirea sesiunilor prezinta urmatoarele avantaje: -Sesiunile pot fi folosite chiar daca browserul utilizatorului nu suporta cookie-uri sau daca acestea sunt dezactivate. -Permit stocarea unui volum mare de informatii, spre deosebire de cookie-uri care sunt limitate in aceasta privinta. -Sunt mai sigure in raport cu cookie-urile deoarece informatiile nu sunt transmise in mod repetat intre client si server.
Initializarea unei sesiuni se face cu functia : session_start(). Aceasta trebuie sa fie printre primele linii de cod dintr-un script PHP, deoarece apelul acestei functii trebuie facut inainte de trimiterii catre browser-ul Web a vreunui HTML sau chiar a unui spatiu vid. Daca folosim stocarea iesirii in buffer nu mai este necesara acesta: 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.
In continuare folosim un exemplu in care avem o pagina principala A.php care contine o legatura catre pagina B.php. In pagina A.php, cream o variabila cu numele user_Name, pe care o initializam cu o anumita valoare. Observam ca daca deschidem pagina B , aceasta variabila poate fi citita intr-un script PHP:
<?php //Fisierul a.php session_start(); if(!isset($_SESSION['userName'])) $_SESSION['userName'] = "Ionescu"; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> Aceasta este pagina A <?php echo "<br>Variabila de sesiune are valoarea: ".$_SESSION['userName']; ?> <br>Legatura <a href="B.php">spre pagina B</a> </body> </html>
<?php //Fisierul b.php session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
<title>Pagina B</title> </head> <body> Aceasta este pagina B <?php echo "<br>Variabila de sesiune are valoarea: ".$_SESSION['userName']; ?> <br>Legatura <a href="A.php">spre pagina A</a> </body> </html>
In acest exemplu se observa ca pagina B detine informatii despre variabila de sesiune creata in pagina A. Se observa ca atribuirea , respectiv citirea variabilelor se face folosind variabila super- globala : _SESSION.
7.2 Manipularea variabilelor sesiunii.
In anumite momente ar putea fi interesant sa aflam identificatorul sesiunii curente. Pentru aceasta folosim functia session_id(), ca in exemplul urmator: <?php //Aflarea identificatorului de sesiune : SID session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <?php echo "Identificatorul sesiunii curente SID este:".session_id(); //Identificatorul sesiunii curente SID este:2846240682abf24a09f42664fc03bbf3 ?> </body> </html>
Functia session_id accepta un parametru. In acest caz 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 //Setarea identificatorului de sesiune session_id(123456); session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <?php echo "Identificatorul sesiunii curente SID este:".session_id(); //Identificatorul sesiunii curente SID este: 123456 Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
?> </body> </html>
Deoarece variabilele de sesiune pot fi citite de alti utilizatori neautorizati, nu este indicat sa pastram aici informatii esentiale cum sint parolele pentru baza de date.
Pentru a creea un minimum de securitate putem codifica aceste informatii , folosind functtile de codare oferite de PHP: md5() sau crypt().
Functia md5(sirDeCaractere) 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,
Acestl lucru este exemplificat in cele ce urmeaza: <?php $sir = Ionescu; echo md5($sir); //produce iesirea: 1f3870be274f6c49b3e31a0c6728957f ?>
Acest mecanism de codare este ireversibil.
Consideram cazul in care avem o variabila de sesiune care pastreaza o parola si dorim sa codam aceasta variabila astfel incat utilizatorii rau intentionati sa nu o poata folosi. Pentru aceasta folosim functia md5(sir), pentru a o cripta. Mai mult initializam o variabila globala cu numele $secret, careia ii atribuim ca valoare un sir de caractere. In continuare concatenam valorile $parola si $secret si apoi criptam rezultatul. In acest caz chiar daca cineve reuseste sa decripteze variabila de sesiune este putin probabil sa poata separa sirul $secret creat de noi. Ca si in cazul conectarilor la baza de date este bine sa pastram acest fisier cu un nivel mai sus decat directorul pentru pagini de Web:
<?php $secret = jfhwpa0cnwwmddien5432fdwwq345s; $parola = computer; session_start(); $_SESSION[parola] = md5($secret.$parola); //Consideram variabila $varTest //Pentru a testa daca valoarea variabilei $varTest este egala cu $parola if(md5($secret.$varTest) == $_SESSION[parola]) echo Valorile sunt egale; else echo Valorile nu sunt egale; ?>
7.2. Stergerea unei sesiuni
Pentru a putea sterge o sesiune este necesar sa incepem scriptul PHP cu instructiunea: Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
session_start, ca intotdeauna cand folosim sesiuni.
Pentru a sterge toate variabilele memorate in matricea $_SESSION folosim unset($_SESSION);
Pentru a sterge doar o variabila memorata in sesiune folosim : unset($_SESIION[numeVariabila]);
Datele sesiunii sunt memorate in server in fisiere temporare. Pentru a sterge datele sesiunii din server folositi: session_destroy();
Acesta procedura este ilustrata in exemplul urmator: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> Stergerea datelor sesiunii <?php //Initializarea datelor sesiunii session_start(); //Sterge matricea $_SESSION unset($_SESSION); //Sterge datele din server session_destroy(); echo "<br>Sesiunea curenta a fost inchisa; ?> </body> </html>
7.3. Crearea si citirea cookie-urilor
Cookie-urile reprezinta o metoda prin care serverul poate salva informatii despre datele utilizatorului in sistemul de calcul al utilizatorului. Multi utilizatori considera cookie-urile ca ceva primejdios prin aceea ca serverul poate afla prea multe informatii despre calculatorul client.In realitate cookie-urile stocheaza doar niste informatii pe discul local al utilizatorului iar utilizatorul are posibilitatea sa afiseze doar informatiile dorite de el.
Majoritatea bowsereleor de Web au posibilitatea sa activeze/dezactiveze cookie-urile. In cazul in care depanati un script PHP si folositi ca browser Internet Explorer, utilizatorul poate modifica setarile privind cookie-urile astfel incat ori de cate ori se primeste sau trimite un cookie, Internet Explorer sa afiseze o fereasta de dialog cu informatii despre numele si valoarea cookie-urilor.
Pentru a realiza acest lucru, selectati : Internet options, apoi executati click pe eticheta Privacy, iar apoi pe butonul Advanced din sectiunea Settings. Selectati optiunea: Override automatic cookie handling si apoi selectati Prompt pentru First Party Cookies cat si pentru Thirt-party cookies:
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
PHP pune la dispozitia utilizatorilor functii pentru transmiterea cookie-urilor de la server la browser, si modalitati de citire a cookie-urilor. Un lucru important de retinut este faptul ca cookie-urile trebuie sa fie transmise inaintea oricarei alte informatii. Cookie-urile se pot transmite cu instructiunea:
setcookie(numeCookie, Valoarea ce se transmite);
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. Citirea cookie-urilor se face simplu accesand variabila super-globala:
$_COOKIE[numeCookie]
In exemplul urmator ne propunem sa afisam un meniu care permite utilizatorului sa selecteze culoare de fundal si culoarea textului intr-o pagina Web. Odata selectate aceste doua valori, trimitem doua cookie-uri cu numele pageColor, respectiv fontColor. Ulterior vom citi aceste valori si fom seta culorile pentru background si text functie de continutul variabilelor setate in aceste doua cookie-uri:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> <body> <?php if($send_cookie) echo "Cookie a fost trimis"; ?> <form action="option.php" method="GET"> <table summary=""> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Al treilea parametru: expirare este folosit pentru a determina perioada de valabilitate a acestui cookie. In general acest parametru se specifica prin adaugarea unui anumit numar de minute la timpul curent. Acest parametru se specifica in secunde. De exemplu daca dorim sa trimitem un cookie care sa aiba durata de viata de o ora :
setcookie(nume, valoare, time() + 3600);
3600 reprezinta 60 minute inmultit cu 60 secunde, deci numarul secundelor dintr-o ora. Atentie: daca specificati acest paramteru ca :
setcookie(nume, valorea, time()-60);
acest cookie va fi sters (durata de viata a expirat). Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Argumentele path si domain sunt folosite pentru a limita un cookie pentru a limita un cookie la un anumit director dintr-un site Web , respectiv la un anumit domeniu (de exemplu www.mySite.ro). Pentru a limita durata de viata a unui cookie astfel incat acesta sa existe numai cand utilizatorul se afla in dosarul domeniului:
setcookie(nume, valorea, time()+3600, /user/);
7.4. Monitorizarea vizitatorilor unui site
In multe situatii reale dorim sa aflam mai multe despre vizitatorii care ne viziteaza site-ul. De aceea in continuare vom scrie un exemplu de script PHP care foloseste cookies si o baza de date MySQL pentru acest scop. Acesta va fi un exemplu simplu de monitorizare a vizitatorilor si anume: vor fi inregistrate doar vizitele la pagina index a site-ului dumneavoastra.
Cand vizitatorul acceseaza pagina index , PHP va verifica daca exista un cookie valid pe sistemul de calcul al utilizatorului. Daca exista inseamna ca persoana a mai vizitat site-ul nostru in perioada de timp prestabilita(durata de viata a cookie-ului). Daca nu exista inseamna ori ca aceasta persoana nu a mai vizitat site-ul nostru , ori ca l-a mai vizitat , dar cu un timp in urma mai mare ca durata prestabilita(durata de viata a cookie-ului). Pentru a mentine date despre vizitatori creea o tabela numita Visitors, intr-o baza de date MySQL: create table visitors(browser char(85) NOT NULL, ip char(30) NOT NULL, host char(85) NOT NULL, timeOfVisit datetime NOT NULL);
Prima coloana: browser , va contine informatii despre browserul folosit de utilizator. Aceste informatii sunt extrase din variabila PHP super-globala: $HTTP_USER_AGENT.
<?php //conectare la baza de date include ("../../dbconnect.php"); //setcookie('visitors',1, time() -60); if(!isset($_COOKIE['visitors'])) { setcookie('visitors',1, time() + 3600); //adaugare vizitator record_user($_SERVER['HTTP_USER_AGENT']); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Monitoring</title> </head> <body> <?php //////////////////////////////////////////////////////////// Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
// Function: browser_info // Purpose: Returns browser type and version //////////////////////////////////////////////////////////// function browser_info ($agent) { // Determine browser type // Search for Internet Explorer signature. $browse_version = ""; $iPos=0; if (($iPos=strpos($agent,'MSIE')) != false ) { $browse_type = "IE"; for($iCrt=$iPos+strlen('MSIE'); $agent[$iCrt] != ';'; $iCrt++) $browse_version .= $agent[$iCrt]; } // Search for Opera signature. elseif (($iPos=strpos($agent,'Opera')) != false) { $browse_type = "Opera"; for($iCrt=$iPos+strlen('Opera'); $agent[$iCrt] != ';'; $iCrt++) $browse_version .= $agent[$iCrt]; } // Search for Netscape signature. The search for the Netscape browser // *must* take place after the search for the Internet Explorer and Opera // browsers, because each likes to call itself // Mozilla as well as by its actual name. elseif (($iPos=strpos($agent,'Mozilla/')) != false) { $browse_type = "Netscape"; for($iCrt=$iPos+strlen('Mozilla/'); $agent[$iCrt] != ';'; $iCrt++) $browse_version .= $agent[$iCrt]; } // If not Internet Explorer, Opera, or Netscape, then call it unknown. else { $browse_type = "Unknown"; $browse_version = "Unknown"; } // return the browser type and version as array return array($browse_type, $browse_version); } //////////////////////////////////////////////////////////// // Function: opsys_info // Purpose: Returns the user operating system //////////////////////////////////////////////////////////// function opsys_info($agent) { // Determine operating system if ( strstr ($agent, 'Win') ) // Search for Windows platform $opsys = "Windows"; elseif ( strstr($agent, 'Linux') ) // Search for Linux platform $opsys = "Linux"; Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
In acest exemplu functia browser_info returneaza browserul, respectiv versiunea browserului sub forma unui array. Functia opsys_info returneaza sistemul de operare al utilizatorului.
Functia record_user() adauga/actualizeaza inregistrarea cu privire la vizitator.
Functia list_vizitors($maxNr) listeaza ultimii maxNr vizitatori in ordinea descendenta a datei ultimei vizite.
Rezultatul executarii acestui script este afisat in figura de mai jos:
7.5 Stergerea cookie-urilor
Un cookie expira automat dupa inchiderea browserului sau dupa scurgerea duratei de viata declarate. Pentru a sterge un cookie se poate proceda dupa cum urmeaza: - se trimite un cookie care contine doar numele fara a fi specificata valoarea: setcookie(nume, ); - sau se declara o durata de viata mai mica ca data/timpul curent: setcookie(nume, , time()-60);
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Capitolul 8. UTILIZAREA CLASELOR IN PHP
8.1 Despre POO, avantajele utilizarii claselor
Programarea orientata pe obiecte:POO reprezinta o metoda moderna de abordare a programarii. Ea s-a dezvoltat datorita faptului ca programele recente au devenit tot mai complexe, iar programarea structurata, bazata pe functii si proceduri nu mai corespunde cerintelor moderne. POO permite descompunerea in subprobleme sau parti corelate cu problema de rezolvat. Unul dintre elementele care stau la baza POO este conceptul de clasa. O clasa este de fapt o structura care contine variabile(membrii) si functii (metode):
class className { var membru1; var membru2; ................... functionclassName(); function metoda1(); function metoda2(); ........................... };
Membrii si metodele declarate intr-o clasa apartin clasei respective si se acceseaza specificand numele clasei. Acest concept se numeste : incapsularea datelor, si contribuie la o mai buna protejare a datelor. In programarea structurata se foloseau multe variabile globale; in cazul unui program complex , practic din orice parte a codului se putea modifica valoarea acestor variabile. In acest caz este destul de greu de depistat portiunea de cod care produce eroarea. In cazul POO , modificarea membrilor unei clase se poate face doar prin metodele clasei(daca nu se specifica acesti membrii ca variabile publice). In acest caz se limiteaza zona de cod suspectata ca a produs eroarea.
Un alt concept important al POO este mostenirea si polimorfismul. Mostenirea consta in aceea ca putem declara anumite clase ca fiind derivate din anumite clase de baza. In cele mai multe situatii astfel de clase extind functionalitatile clasei de baza. In acest fel se reduce foarte mult cantitatea de cod necesara.
8.2. Declararea claselor, clase derivate
Declaratia unei clase incepe cu cuvantul cheie: class .Variabilele sau membrii clase se specifica folosinf cuvantul: var. Functiile sau metodele unei clase se declara specificand cuvantul function . Clasele au un constructor al clasei adica o metoda speciala care instantiaza o clasa. Numele functiei constructor este acelasi cu numele clasei.
In continuare consideram clasa Cpersoanal, care are urmatorii membrii: $nume, $ocupatia, $varsta
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
<?php class CPersoana { var $nume; var $ocupatia; var $varsta; function CPersoana ($aName, $aOcupation, $age) { $this->nume=$aName; $this->ocupatia=$aOcupation; $this->varsta=$age; } function getName() { return $this->nume; } function getOcupatia() { return $this->ocupatia; } function getVarsta() { return $this->varsta; } } //Utilizarea clasei CPersoana //Creeaza o instanta a clasei CPersoana $pers = new CPersoana (Ionescu,mecanic, 35,Ionescu@yahoo.com); echo <br>Numele este.$pers->getName(). Ocupatia=.$pers->getOcupatia(); ?>
Dorim sa extindem clasa de mai sus astfel incat sa contina si date despre home-page si e-mail:
<?php class CpersoanaCuEmail extends CPersoana { var $email; var $home_page; function CpersoanaCuEmail ($aName, $aOcupation, $age, $aHomePage, $aEmail) { $this->nume=$aName; $this->ocupatia=$aOcupation; $this->varsta=$age; $this->home_page = $aHomePage; $this->email=$aEmail; } function getEmail() { return $this->email; } function getHomePage() { return $this->home_page; } } //Utilizarea clasei CpersoanaCuEmail Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
//Creeaza o instanta a clasei CpersoanaCuEmail $pers = new CpersoanaCuEmail (Ionescu,mecanic, 35,www.Ionescu.ro, Ionescu@yahoo.com); echo <br>Numele este.$pers->getName(). Ocupatia=.$pers->getOcupatia(). Home page:.$pers->getHomePage();; ?>
8.3. Instantierea claselor; stergerea instantelor unei clase
Instantierea unei clase se face prin operatorul new: $var1 = new NumeClasa();
Variabila $var1 contine o referinta la obiectul clasei. In continuare referirea metodelor clasei se face prin operatorul de referentiere: -> ca mai jos: $var1->Metoda1();
apeleaza metoda cu numele Medoda1() ,care apartine clasei NumeClasa.
Stergerea instantelor unei clase se face simplu prin apelarea functiei: unset($var1);
In continuare orice apel de genul $var1->Metoda1(); va fi semnalat ca eroare.
Atentie: in cazul in care am initializat unii membrii ai clasei cu variabile de tip obiect sau resurse, este bine ca inainte de stregerea instantelor clasei sa eliberam memoria ocupata de acestea. Oricum PHP dispune de un mecanism de garbadge-collection , care elimina din memorie elementele alocate dar care nu mai sunt referite in program.
Pentru a exemplifica aceste lucruri, in continuare vom implementa o clasa : ParserXML, cu care vom parcurge un document XML.
PHP pune la dispozitie cateva functii importante pentru manipularea docmentelor XML: xml_parser_create(); returneaza o referinta catre resursa XML parser xml_parser_free($resursa); elibereaza resursa creata de functia de mai sus xml_parse($data); Start parsing pentru un document xml_set_element_handler($resursa , openTagFunc,closeTagFunc) specifica functiile callback care vor fi apelate de PHP in cadrul elementelor xml_set_caracter_data_handler($resursa , carDataFunc); specifica functia callback apelata de PHP pentru character data.
Vom folosi clasa ParserXML pentru a citi un document XML dintr-un fisier de pe disk si a-l transforma in document formatat HTML: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
<body> <?php class ParserXML { var $m_parser; // resursa parserului XML var $m_html; // documentul HTML formatat var $m_xml_file; // fisierul XML var $m_open_tags; // Array: taguri de inceput var $m_close_tags; //Array: taguri de sfirsit function ParserXML() { $this->m_html=""; $this->m_xml_file=""; $this->m_open_tags = array(); $this->m_close_tags = array(); $this->m_parser = xml_parser_create(); xml_parser_set_option($this->m_parser, XML_OPTION_CASE_FOLDING, false); xml_set_object($this->m_parser,$this); xml_set_element_handler($this->m_parser,"openElement", "closeElement"); xml_set_character_data_handler($this->m_parser,"caracterData"); } function ParserDestroy() { xml_parser_free($this->m_parser); } function setOpenTags($arrOpenTags) { $this->m_open_tags=$arrOpenTags; } function setCloseTags($arrCloseTags) { $this->m_close_tags = $arrCloseTags; } function html() { return "<html>$this->m_html</html>"; } function openElement($parser, $tag, $attributes) { if($format=$this->m_open_tags[$tag]) $this->m_html .= $format; //if($tag=="nume" && isset($attributes['email'])) { //$format = "<a href='mailto:".$attributes['email']."'> Mail to ".$attributes['email']; //$this->m_html .= $format; //} } function closeElement($parser, $tag) { //if($tag=="nume") { //$this->m_html .="</a>"; //} if($format=$this->m_close_tags[$tag]) Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Scriptul de mai sus va genera un tabel cu coloanele: nume, adresa,virsta.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Capitolul 9. EXEMPLU DE SCRIPT PHP
Un formular (form) se creaza folosind tagul HTML <form> iar marcajul de sfarsit de formular se creaza cu tagul </form>
Ca parametrii ai form-ului se specifica action=numeScript.php, prin acest parametru se specifica scriptul care va procesa datele trimise din form. Un alt parametru important este : method = GET sau method = POST care specifica modalitatea in care vor fi transmise datele spre scriptul PHP. Metoda POST transmite datele fara a fi vizibile de utilizator, metoda GET foloseste URL-ul urmat de unul sau mai multi parametrii care de fapt reprezinta valorile cimpurilor din form.
Acesta pagina HTML va genera un formular ca mai jos:
Introducem in continuare secventa care va prelua datele din formular. In cazul in care Name=Ion si Password=computer scriptul va afisa : <br>Salut Ion .Autentificare realizata' ; iar in alte cazuri scriptul va afisa : Nume sau parola incorecte<br>Incercati din nou
Scriptul introdus are culoarea albastra: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> <body> <?php if(isset($_POST)) { if($_POST['name'] == 'Ion' && $_POST['password']== 'computer'){ echo '<br>Salut'.$_POST['name'].'<br>Autentificare realizata'; die; } else echo '<br>Nume sau parola incorecte<br>Incercati din nou'; } } ?> <form action="test2.php" method="POST"> <table summary="" bgcolor="#808080"> <tr> <td> <table cellpadding="1" cellspacing="1" border="0"> <caption><font color="#3399ff" size="4">User authentification</font></caption> <tr align="right"> <td align="right">Name</td> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Daca utilizatorul selecteaza linkul: New user , va fi incarcat scriptul autentif.php, care creeaza un formular cu datele personale ale utilizatorului si introduce aceste date intr-o tabela din baza de date. Pentru conectare la baza de date am folosit urmatorii paramtrii:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Formular de inregistrare</title> </head> <body> <?php //Conectare la BD $host="localhost"; $port="3306"; $userName="webuser1"; $password="pass1";
$handler = mysql_connect($host, $userName, $password); if(!$handler) { echo 'Conectare la baza de date esuata. Nume sau parola incorecte'.mysql_error();; die(); } Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
else{ echo 'Autentificare reusita in BD'; if(!mysql_select_db('tst2',$handler)) echo 'Could not find database '; if(isset($_GET)) { if(isset($_GET['nume']) && isset($_GET['pass'])) { $query ="SELECT nume,parola from utilizatori WHERE nume='".$_GET['nume']."' AND parola='".$_GET['pass']."'"; $result = mysql_query($query,$handler); //echo "after"; /*if(!$result) { echo "MySQL Error: ".mysql_error(); die(); } else*/
$rows = mysql_num_rows($result); if($rows > 0) { echo "Utilizatorul cu numele ".$_GET['nume']." exista deja in baza de date"; } else { $query = "INSERT INTO utilizatori (nume, parola, email, telefon, localitate) VALUES("; $query .= "'".$_GET['nume']."',"; $query .= "'".$_GET['pass']."',"; $query .= "'".$_GET['adr_email']."',"; $query .= "'".$_GET['telefon']."',"; $query .= "'".$_GET['localitate']."');"; $result = mysql_query($query); if(!$result) { echo "MySQL Error: ".mysql_error(); die(); } else { "Utilizatorul ".$_GET['nume']." a fost introdus in baza de date"; } } } } } ?>
<form action="autentif.php" method="GET"> <table summary="" bgcolor="#c0c0c0"> <tr><td> Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.
In continuare modificam scriptul de logare astfel incat sa se confrunte informatiile din formular cu cele existente in baza de date.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Untitled</title> </head> <body> <?php if(isset($_POST)) { if(isset($_POST['name']) && isset($_POST['password'])) { //Logare la BD $handler = mysql_connect('localhost:3306','webuser1','pass1'); if(!$handler) { echo "Could not connect to database ".mysql_error(); die(); } mysql_select_db('tst2'); $query = "SELECT nume,parola from utilizatori WHERE nume='".$_POST['name']."' AND parola='".$_POST['password']."';"; //echo "<br>Query=".$query; $result = mysql_query($query); if(!isset($result) || !mysql_num_rows($result)) { echo "Nume sau parola incorecte.<br>Incercati din nou"; Modulul 4 Tehnologii Web avansate Curs: PHP _______________________________________________________________________________________________ Acest document este proprietatea Institutului Multimedia Romano-Elvetian.