Archive for category Php tutorial
XML Documente well-formed
Posted by admin in Php tutorial on February 18, 2010
Documente well-formed
Precum se vede, XML permite definirea de limbaje (vocabulare) ce contin si descriu datele. Libertatea creatorului nu este insa absoluta: pentru ca un fisier XML sa poata fi citit si “inteles”) de catre o alta aplicatie, este necesar ca el sa respecte niste reguli generale de sintaxa.
Iata setul de reguli de care trebuie tinut seama la crearea unui fisier XML:
- reguli ce tin de elemente
- fisierul trebuie sa contina un singur element radacina (eel aflat in radacina fisierului si care nu are element parinte)
- fiecare element ce contine date trebuie sa aiba atat tag de inceput, cat si de incheiere
- tagul de inceput poate contine spatiu intre nume si >, insa nu si intre < si nume (ex: <nume > este permis,pe cand < nume> este invalid)
- elementele ce nu contin date pot fi prescurtate: <element/> in loc de <element></element>
- elementele nu pot fi partial suprapuse (ex: <tag7>texr<tag2>text</tagl>text</tag2>);
- fiecare element trebuie sa fie continut integral in interiorul altuia (cu exceptia elementului radacina)
- numele elementelor
-
■ sunt case-sensitive (nu putem scrie ca in HTML, <P>text</p>)
■ nu pot incepe cu xml (in orice combinatie de litere mici/mari)
■ pot incepe doar cu litera sau – (minus), fiind permise pe pozitiile urmatoare si numere, minus si punct. Nu sunt permise spatii, =, : etc
■ pot contine caractere cu semne diacritice (ex: a, i, e etc)
- reguli ce tin de atribute
- numele atributelor respecta aceleasi reguli ca numele de elemente
- nu este permisa existenta mai multor atribute cu acelasi nume pentru acelasi element
- fiecare atribut trebuie sa aiba valoare (nu este permis, de exemplu, <input type=checkbox checked>)
- valoarea fiecarui atribut trebuie inclusa intre ” ” sau ”. In interiorul ghilimelelor pot fi folosite apostroafe si invers (ex: <clasa nume=’Clasa “PHP 21 august” ‘>)
• reguli pentru PCDATA
- nu este permisa folosirea caracterelor <, >, &,” si’. Daca PCDATA contine asemenea caractere, ele trebuie reprezentate folosind secvente predefinite – asa-numitele entity references (vezi tabelul alaturat)
| Simbol | Inlocuitor |
| < | < |
| > | > |
| & | & |
| ‘ | ' |
| 11 | " |
Un document care se conformeaza acestor reguli are proprietatea de a fi well-formed (corect din punct de vedere sintactic).
Tutorial XML
Posted by admin in Php tutorial on February 18, 2010
Ce este XML
XML (Extensible Markup Language) cste o specificatie W3C (World Wide Web Consortium) care reprezinta un set de reguli ce permit crearea unor limbaje de transport al datelor. El deriva din SGML (Standard Generalized Markup Language), o specificatie complexa ce reprezinta parintele multor alte limbaje de acest fel (HTML, DocBook etc).
Un fisier XML este un fisier text structurat, care contine:
- datele utile – informatia utila ce se doreste a fi transmisa
- informatii despre aceste date {meta-data) - de exemplu, felul in care datele se afla in relatie unele cu altele. Meta-informatia este specificata cu ajutorul unor tag-uri (marcatoare), asemanatoare cu cele folosite in codul sursa HTML.
lata un exemplu de fisier XML:
<?xml version=”1.0″?> <produs id=”34″>
<denumire>Carte</denumire>
<pret>24.5</pret>
</produs>
Fisierul de mai sus contine informatiile despre un produs cu id-ul 34, denumirea Carte si pretul de 24.5. In afara de aceste 3 informatii, toate celelalte reprezinta meta-data: prima linie indica versiunea de XML, iar tag-urile <produs>, <denumire> si <pret> denumesc informatiile continute in fisier, stabilind si apartenenta denumirii si pretului la produs.
Desi un fisier XML este pana la un punct asemanator cu unul HTML, cele doua tehnologii difera in multe aspecte:
- HTML a fost gandit pentru a specifica structura si modul de prezentare a datelor, pe cand XML are ca scop memorarea structurata a datelor in scopul transportului lor intre sisteme de calcul diferite
- HTML este un limbaj, el dispunand de un set prestabilit de tag-uri; XML este o specificatie ce permite programatorului sa defineasca propriile tag-uri, care sa descrie cat mai bine datele utile si relatiile dintre ele
Avantaje si utilitate XML
Fisierele XML fiind fisiere text, ele au avantaje multiple:
- sunt usor de inteles de catre ochiul uman
- sunt usor de “inteles” pentru o aplicatie
- nu depind de platforma hardware sau software pe care ruleaza aplicatiile ce lucreaza cu XML. Exista biblioteci de functii XML pentru toate platformele software, asadar un fisier XML scris sau generat in Windows poate fi citit pe MacOS sau Linux.
Un fisier XML poate fi privit ca o mini-baza de date, care este insa usor de manipulat folosind biblioteci deja scrise, si care poate fi folosita cu succes pentru transferul de date intre sisteme altminteri incompatibile.
Elemente si PCDATA
Sa consideram ca referinta urmatorul fisier XML:
<persoana>
<nume>john <porecla>The man </porecla>Doe </prenume>
<varsta>30</varsta>
</persoana>
Un tag (marcator) XML reprezinta textul ce incepe cu < si se incheie cu >. In exemplul de mai sus, <persoana>, <nume>, <porecla>, <prenume> si <varsta> sunt tag-uri. Tag-urile sunt in general pereche: exista un tag de inceput si unul de incheiere, eel de incheiere avand acelasi nume cu eel de inceput dar incepand cu </ (ex: <nume>…</nume> ). Tag-urile sunt cele care specifica structura informatiei; informatia utila este cea prezenta intre tag-urile de inceput si de sfarsit (ex: 30, John, Doe etc in exemplul de mai sus)
Un element XML reprezinta toata informatia cuprinsa intre un tag de inceput si tag-ul corespunzator de incheiere. Intre cele doua tag-uri se pot afla:
- doar date de tip text – ex: elementele <varsta> si <porecla> din exemplul nostru). In acest caz, continutul elementului (textul dintre taguri) este denumit parsed character data sau, pe scurt, PCDATA
- alte sub-elemente sau o combinatie de text si sub-elemente – ex: elementul <nume>, elementul <persoana> din exemplul de mai sus
Atunci cand un element contine alte elemente, el reprezinta pentru ele elementul parinte, iar cele continute sunt elemente copil ale sale.
Fisierul de mai sus contine urmatoarea structura:
- un element radacina (asa-numitul root element) - tag-ul <persoana>, care la randul sau contine alte elemente
- elementul <persoana> are doua elemente copil – <nume> si <varsta>
- elementul <varsta> are continutul de tip PCDATA cu valoarea 30
- elementul <nume> contine:
- elementul <porecla> contine PCDATA cu valoarea The Ripper
o PCDATA cu valoarea John
o elementul <porecla>
o PCDATA cu valoarea Doe
Atribute
Atributele reprezinta perechi nume=valoare asociate unui element, specificate in cadrul tagului de inceput al elementului, separate prin spatii fata de numele tagului si intre ele. Un element poate avea zero sau mai multe atribute. Orice atribut are valoare (chiar daca este cea vida), care trebuie inclusa intre ” sau ‘:
<student tip=”cisco” id=’135′>
<username>anonymous</username> </student>
PROTECTIA OUTPUT-ULUI
Posted by admin in Php tutorial on February 10, 2010
Protectia output-ului se refera la datele care parasesc aplicatia PHP, cu destinatia browser, baza de date etc.
Continutul HTML pe care un script PHP il trimite catre un browser se poate compune din informatii statice (cod HTML deja scris) si informatii dinamice – de.exemplu, date extrase dintr-o tabela SQL, sau informatii provenite sub forma de input de la utilizator. Programatorul trebuie sa se asigure ca datele preluate din surse externe si trimise catre browser nu contin nimic daunator pentru securitatea utilizatorului.
Exemplu: un site dispune de o pagina in care utilizatorii pot introduce sugestii, cu ajutorul unei componente de tip textarea. Sugestiile ultimului utilizator sunt afisate si ele in aceeasi pagina. Input-ul este stocat intr-o baza de date si extras prin intermediul unei interogari – iata fragmentul de cod relevant:
$rez = mysql_query(“SELECT sugestie FROM sugestii ORDER BY sugestie DESC LIMIT 1″);
$rez = mysql_retcn_row($rez);
echo “Comentariul precedent:<br />”;
echo $rez[0];
Daca un utilizator introduce in textarea un comentariu care contine cod HTML:
Site-ul dvs este <b><u>plictisitor</u></b>, va rog impuscati designerul.
mesajul va fi stocat ca atare in baza de date, iar codul de mai sus il va trimite nemodificat catre browser; urmarea va fi formatarea unei portiuni de cod asa cum doreste utilizatorul.
Acesta este doar inceputul; un utilizator cu o imaginatie mai bogata ar putea incerca sa introduca un mesaj publicitar ce contine un link, iar unul rauvoitor ar putea folosi urmatoarea secventa:
<script language= “javascript”>
document, locations ‘http://www. site-rauvoitor. com’
</script>
Daca aceasta “sugestie”, odata stocata in baza de date, este trimisa ca atare catre browserele altor utilizatori, acestia vor fi redirectionati catre www.site-rauvoitor.com, aflat sub controlul atacatorului, care ar putea sa le fure cookie-uri, sa le planteze virusi etc.
Problema in scenariul de mai sus era faptul ca anumite combinatii de caractere sunt interpretate ca elemente de control ale limbajului HTML in loc sa fie afisate ca atare in browser (spre exemplu, < si > sunt interpretate ca delimitatoare de tag). Pentru ca aceste caractere sa fie afisate ca atare, fara a li se lua in seama semnificatia speciala, este necesara reprezentarea lor intr-un alt fel – si anume sub forma asa-numitelor entitati HTML: < devine < iar > devine > . Procedeul este asemanator cu secventele escape de la string: atunci cand aveam nevoie sa includem caracterul” in interiorul unui string delimitat tot cu “, il reprezentam diferit, folosind secventa \” .
PHP ofera doua perechi de functii care se ocupa de escaping-ul (reprezentarea speciala) a caracterelor cu statut aparte:
• string htmlspecialchars ( string $string [, int $quote_stylel) - transforma caracterele &, <, >,'," din
$string in entitatile HTML corespunzatoare. Al doilea argument controleaza modul de transformare
pentru ghilimele si apostroafe - iata valorile posibile:
o ENT_COMPAT - transforma numai ghilimelele si lasa neatinse apostroafele
o ENT_QUOTES - transforma atat ghilimelele cat si apostroafele
o ENT_NOQUOTES - nu transforma nici ghilimelele nici apostroafele
Functia care realizeaza translatia inversa este htmlspecialchars_decode().
• string htmlentities ( string $string [, int $quote_style [, string $charset]) – functioneaza pe acelasi
principiu ca si htmlspecialchars(), insa transforma in entitati HTML toate caracterele care au o entitate
corespunzatoare. Argumentul quote_style are acelasi efect ca in cazul lui htmlspecialchars().
Functia pentru translatia inversa este html_entity_decode().
Exemplu: in scenariul prezentat anterior, la citirea ultimei sugestii din baza de date si afisarea ei pe ecran, avem grija sa transformam caracterele speciale in entitati HTML:
$rez = mysql_query(“SELECT sugestie FROM sugestii ORDER BY sugestie DESC LIMIT 1″); $rez = mysql_fetch_row($rez);
$rez = html special chars($rez[0]);
echo “Comentariul precedent:<br />”;
echo $rez;
Nota: atunci cand stim ca anumite date vorfi destinate exclusiv afisarii pe ecran, putem aplica htmlspecialchars()/htmlentities() inaintea stocarii lor in baza de date, ele putandfi apoi extrase si afisate ca atare. Daca insa utilizarea lor vafi una mixta, este mai sigur ca transformarea sa sefaca doar inainte de afisare, iar informatiile sa stea in baza de date nealterate.
Datele trimise catre serverul de baze de date
Comenzile transmise catre baza de date contin deseori informatie provenita din variabile, inclusiv input provenit de la utilizator. Aceste informatii pot contine caractere care au regim special pentru baza de date in cauza. Spre exemplu, caracterul ‘ (apostrof) este folosit in SQL pentru delimitarea valorilor de tip string sau date.
Sa ne imaginam ca avem o tabela SQL numita Edituri in care dorim sa introducem date provenite dintr-un formular HTML. Codul care realizeaza acest lucru ar putea arata astfel:
$editura = $_POST['nume_editura'];
$sql= “INSERT INTO Edituri(Nume) VALUES(‘$editura’)”;
$r = mysq1_query($sql);
Atunci cand utilizatorul introduce in formular editura O’Reilly, interogarea $sql devine:
INSERT INTO Edituri(Nume) VALUES (‘O’Reilly”);
Apostroful din O’Reilly il va inchide pe eel ce semnalizeaza inceputul valorii, iar interogarea – care acum contine o eroare de sintaxa – va esua. O astfel de vulnerabilitate poate fi folosita de un atacator iscusit in scopuri mult mai rele decat esecul unei operatiuni de insert.
Ca si in cazul afisarii datelor in browser, caracterele cu regim special pentru serverul de baze de date destinatie trebuie reprezentate diferit, astfel incat ele sa nu fie interpretate de catre baza de date ca si caractere speciale. Vorbim tot de o modalitate de escaping, insa care actioneaza asupra altui set de caractere si este influentata de alte setari.
Exista mai multe variante de a realiza reprezentarea corecta a caracterelor speciale in comenzile trimise catre baza de date:
• folosirea functiei PHP addslashes() pentru adaugarea unui caracter escape (\) inaintea caracterelor
speciale
• facilitatea de magic quotes a PHP, activabila din fisierul de configurare php.ini
• folosirea functiilor de escaping puse la dispozitie de catre extensia corespunzatoare bazei de date
folosite
• folosirea de prepared statements
PHP ofera programatorului urmatoarele functii predefinite:
string addslashes ( string $str) – adauga caracterul escape \ in fata fiecarui caracter ” (ghilimele),’ (apostrof), \ (backslash) sau NUL (valoarea 0).
• string stripslashes ( string $str ) – elimina caracterele escape introduse de addslashes()
Functii de escaping ale extensiei PHP pentru lucrul cu baza de date
Desi reprezinta o masura de siguranta buna pentru inceput, deseori addslashes() nu este suficient, deoarece diferitele softuri de baze de date folosesc felurite caractere speciale pe care addslashes() nu le transforma. Extensiile PHP pentru lucrul cu baze de date ofera fiecare functii sau metode pentru transformarea unui sir de caractere astfel incat el sa nu contina caractere SQL speciale. lata cateva exemple de astfel de functii:
- string mysql_real_escape_string ( string $string [, resource $link_identifier]) – adauga caracterul scape \ in fata caracterelor NUL (codul 0), \n, \r, \,’,” si EOF (end-of-file – codul 26) gasite in $string, returnand rezultatul transformarii. Functia este introdusa de extensia mysql•string mysqli_real_escape_string ( mysqli $link, string $escapestr ) – idem, dar introdusa de extensia mysqli
Exemplu: inserarea datelor de la utilizator in baza de date:
$editura = mysql_real_escape_string($_POST['nume_editura']);
$sql = “INSERT INTO Edituri(Nume) VALUES(‘$editura’)”;
$r = mysql_query($sql) ;
Cookie-uri in PHP
Posted by admin in Php tutorial on February 5, 2010
Principii generale
Cookie-urile reprezinta perechi nume-valoare pe care serverul web le poate stoca pe hard-disk-iul clientului, prin intermediul browserului web. Ele sunt transmise clientului prin intermediul. unui header HTTP (Set-Cookie sau Set-Cookie2), in cadrul unui raspuns la o cerere a clientului. La urmatoarele cereri depuse de acelasi client catre acelasi server, clientul va trimite automat continutul cookie-ului catre server, care poate folosi datele respective ca si date de intrare ale unei aplicatii ce genereaza o pagina web (asemanator cu informatiile provenite prin GET sau POST). Astfel, cookie-urile sunt un mecanism de propagare a informatiei de la o cerere la alta.
Iata doua utilizari tipice pentru cookie-uri:
• un site care contine o sectiune restrictionata, accesibila numai utilizatorilor autentiflcati, seteaza un cookie in browserul clientului in momentul in care acesta se autentifica. Cookie-ul contine id-ul clientului si va fi trimis automat serverului la cererile urmatoare efectuate de client, ceea ce va permite serverului sa-1 identifice si sa-i trateze cererile ca parte a unei sesiuni
• un site care permite utilizatorului sa specifice preferinte (ex: limba dorita, culoarea etc); odata alese, aceste preferinte sunt stocate pe hard-disk-ul clientului intr-un cookie si sunt trimise serverului la fiecare cerere ulterioara, ceea ce ii da acestuia posibilitatea de a genera de fiecare data pagina in concordanta cu preferintele exprimate anterior de client
Lucrul cu cookie-uri prezinta urmatoarele caracteristici:
• avantaje
- un cookie poate memora informatie in mod persistent, intre doua cereri ale clientului, chiar daca elesunt efectuate la momente de timp indepartate (ex: zile)
- mecanismul de cookies functioneaza in mod transparent pentru utilizator – browserul si serveral web fac operatiile necesare pentru mentinerea starii intre cereri
• dezavantaje
- utilizatorul poate sterge cookie-urile din browse
- browserul poate fi configurat sa nu accepte cookies sau sa le accepte selectiv
- browserele ofera de obicei spatiu de stocare drastic limitat pentru cookies
Parametrii unui cookie
Fiecare cookie trimis clientului are urmatorul set de parametri:
- nume – cel prin intermediul caruia vor fi accesate datele de catre server atunci cand cookie-ul este trimis inapoi de catre client - valoare – informatiile stocate in cookie
- data de expirare - specifica momentul stergerii cookie-ului; daca lipseste, cookie-ul este sters atunci cand userul inchide browserul. Serverul poate schimba acest parametru pentru un cookie deja setat (de exemplu, poate forta stergerea lui setand data de expirare in trecut)
- domeniu si cale -specifica in ce conditii este trimis inapoi cookie-ul catre server: numai daca domeniul este acelasi si URI-ul cerut de client se afla in interiorul caii specificate in cale
- secure - pune conditia ca cookie-ul sa nu fie transmis serverului decat daca conexiunea acestuia cu clientul este una criptata (HTTPS)
- http only – pune conditia ca cookie-ul sa fie accesibil doar serverului web prin intermediul protocolului HTTP, nu si limbajelor de scripting locale (ex: Javascript)
Parametrii nume si valoare sunt obligatorii, toti ceilalti sunt optionali.
Lucrul cu cookies din PHP
Numim setarea unui cookie operatia prin care serverul trimite un cookie catre client prin intermediul headerului HTTP corespunzator, determinand fie crearea cookie-ului in browserul clientului, fie modificarea parametrilor unui cookie setat anterior.
Functia PHP predefinita folosita in acest scop este setcookie:
setcookie ($nume [, $cale [, $expirare [, $cale [, $domeniu [, $secure [, $httponly]]]]]])
Functia returneaza FALSE daca scriptul a produs deja output (si deci headerul HTTP Set-Cookie nu mai poate fi trimis).
Argumentele functiei se mapeaza pe parametrii unui cookie, cu urmatoarele mentiuni:
- valoarea unui cookie nu poate fi decat scalar
- momentul expirarii
- se specifica sub forma de Unix time (numarul de secunde scurs de la 1 ianuarie 1970, care este data conventional a a crearii sistemultii de operare Unix). Functia PHP timeO intoarce momentul prezent exprimat in acest fel, ceea ce o face foarte potrivita pentru setarea momentului expirarii unui cookie
- daca nu este specificat sau setat pe valoarea 0, cookie-ul va expira cand utilizatorul inchide browserul
Exemple:
// setare cookie doar cu nume si valoare: expira la inchiderea browserului
setcookie(“c_id”, 4167);
// setare cookie cu specificarea momentw.lui expirarii: 2 minute de la setare
Setcookie (“color”,”red”, time()+60);
Atentie! Deoarece trimiterea cookie-urilor se.face prin intermediul unui header HTTP, toate cookie-urile trebuie setate inaintea oricarui output al scriptului PHP!
Daca se doreste trimiterea intr-un cookie (si recuperarea ulterioara) a mai multor valori, exista doua posibilitati:
• se seteaza mai multe cookie-uri. Daca se doreste ca, la citirea valorii acestora, sa se obtina un tablou (vezi mai jos accesarea informatiei din cookies), numele cookie-urilor pot fi setate cu sintaxa de tablou:
setcookie(“cookie[0]“, 3);
setcookie(“cookie[l]“, 5);
• se includ valorile in cauza intr-un tablou, care este transformat intr-un string folosind functiile serialize() sau implode()
Accesarea informatiei provenite din cookies
Clientul trimite automat impreuna cu cererea HTTP toate acele cookie-uri ale caror parametri domeniu si cale corespund cu URL-ul solicitat in cerere. Daca URL-ul determina executia unui script PHP, interpretorul PHP primeste de la server informatia din cookie si o stocheaza in variabila $_COOKIE – un tablou asociativ de tip superglobal. Acest tablou contine cate un element pentru fiecare cookie primit, perechea cheie-valoare fiind reprezentata de numele si valoarea cookie-ului.
Atentie! Un cookie este setat intr-un raspuns al serverului si este disponibil acestuia abia incepand cu cererea urmatoare!
If(isset($_cookie(‘lang’])){
$preferred_language = $_COOKIE’lang’];
else{
$preferred_language = “en”;
setcookie(“lang”,”en”);}
Stergerea unui cookie
Stergerea unui cookie se poate face in diferite moduri:
• ca urmare a unei actiuni a utilizatorului: browserele din ziua de astazi ofera utilizatorului interfete facile pentru managementul cookie-urilor, inclusiv stergerea sau modificarea parametrilor acestora
• ca urmare a unei actiuni efectuate pe server:
- programatorul poate da valoarea vida cookie-ului (trimitand un cookie cu parametri identici daravand ca valoare sirul vid)
- programatorul poate, seta momentul expirarii cookie-ului in trecut
Exemplu: pentru un cookie setat initial astfel:
// setarea initiala a cookie-ului
setcookie(“nume”,”Mihai”,time()+2000);
modalitatile de stergere sunt:
// … la o cerere ulterioara* cookie-ul este suprascris, dandu-i-se valoarea “”
setcookie(“nume”, “”);
// …alternativ, se putea muta in trecut momentul expirarii
setcookie(‘nume”, “Mihai”, time() -86400) ;
Nota: este o practica buna ca, la stergerea unui cookie, timpul de expirare safie setat mult in trecut, deoarece ora de pe server si cea depe client pot diferi semnificativ, iar decizia stergerii cookie-ului la expirare ii apartine browserului, care ruleazape client.
Lucrul cu headere HTTP din PHP
Posted by admin in Php tutorial on February 3, 2010
Asa cum, in sistemul de fisiere, pe langa informatia utila dintr-un fisier sunt stocate si informatii despre acesta (data crearii, a ultimei modificari etc), la fel intr-un mesaj HTTP sunt transmise, pe langa datele efective, informatii de control (ex: informatii despre continutul mesajului, despre client, server etc). Aceste informatii aditionale poarta denumirea de headere HTTP si sunt importante pentru programatorul PHP deoarece prin intermediul lor se realizeaza operatii precum:
- redirectionarea clientului catre o alta adresa (prin intermediul headerului Redirect)
- specificarea tipului de continut pe care serverul il trimite clientului, astfel incat browserul web sa stie cum sa trateze acel continut: sa il afiseze direct (daca este vorba de text simplu), sa il afiseze formatat (daca este sursa HTML), sa il deschida cu ajutorul unui plug-in1 (daca este de tip PDF sau doc) etc. Toate acestea sunt posibile prin intermediul headerului HTTP Content-type
- setarea unui cookie (memorarea unei informatii pe client, in scopul extragerii ei ulterioare) – cu ajutorul headerului Set-Cookie (vezi sectiunea despre cookies in cadrul acestui material)
- specificarea strategiei de caching a browserului pentru pagina ceruta – cu ajutorul headerelor Cache-Control si Expires. Browserele internet incearca in general sa pastreze in cache cat mai multa informatie posibila, astfel incat utilizatorul sa aiba dublul avantaj al vitezei si al consumului mai mic de banda. Uneori insa pastrarea unei copii a unei pagini pe client nu este dezirabila (ex: pentru paginile generate dinamic, al caror continut se poate schimba de la o cerere la alta)
Headerele sunt de forma Nume-Header: informatii. In mesajul HTTP, headerele se afla intotdeauna inaintea! continutului mesajului si sunt separate de acesta printr-o linie goala. De aceea. este important ca, atunci cand o aplicatie genereaza dinamic continut web (inclusiv headere HTTP atasate acestui continut), headerele sa fie generate inaintea oricarui alt output al aplicatiei generatoare.
Lucrul cu headere HTTP din PHP
PHP pune la dispozitia programatorului cateva functii predefinite pentru lucrul cu headere HTTP:
- header() – folosita pentru a trimite headere HTTP specificate de programator catre client
- headers_sent() - folosita pentru a verifica daca headerele au fost deja trimise catre client (caz in care nu mai putem adauga altul)
- headers__listO - returneaza lista de headere destinate clientului (care au fost deja trimise sau care sunt in asteptare)
Functia header are urmatorul prototip:
void header ( string $header [, bool $replace [, int $http_response_code]]
lata semnificatiile argumentelor:
- Sheader - reprezinta headerul HTTP in forma in care acesta apare in mesajul HTTP (exemplu: “Location: http://www.example.com/index.php“)
- Sreplace - indica daca, in caz ca exista deja un header cu acelasi nume, noul header sa il inlocuiasca pe cel vechi sau sa fie adaugat listei de headere ce trebuie trimise clientului.
- $http_response_code - specifica codul de raspuns HTTP care sa fie trimis clientului. Codurile de raspuns HTTP sunt formate din 3 cifre, iar in functie de prima cifra pot avea urmatoarele semnificatii:
- 1xx – coduri de informare a clientului, intermediare o
- 2xx – coduri ce indica succesul unei cereri a clientului o
- 3xx – redirectionari
- 4xx - indica o eroare din partea clientului (ex: 404 – Not Found)
- 5xx – erori ale serverului sau incapacitatea acestuia de a onora cererea clientului (ex: 503 Service Unavailable)
//fortam aparitia ferestrei de save in loc de simpla afisare formatata in browser header (“Content-di sposition: attachment; filename=statistici.html”);
// trimiterea unui fisier .doc prin intermedin”! unui script PHP header(“Content-type: text/html”);
HTTP este un protocol stateless – fiecare cerere este tratata de catre server independent de celelalte, serverul nu isi “aminteste” ce s-a intamplat la cererile anterioare si nu coreleaza in vreun fel mai multe cereri, chiar daca ele provin de la acelasi client sau daca corespund unor resurse aflate in acelasi site.
Solutii pentru memorarea informatiei intre doua cereri
Pentru ca serverul sa poata mentine informatii care tin de un anume client de la o cerere a acestuia la alta, este necesara salvarea datelor in cauza la incheierea unei cereri si incarcarea lor la cererea urmatoare. Memorarea acestor date se poate face:
• pe client. Solutia este mecanismul de cookies – mici cantitati de informatie pe care serverul web le poate stoca pe hard-disk-ul clientului, urmand ca ele sa-i fie trimise inapoi serverului la cererile urmatoare pe care clientul le efectueaza (vezi mai jos sectiunea despre cookies)
• pe server. Solutia este sistemul de management al sesiunilor: serverul aloca clientului un spatiu de stocare pentru informatii proprii (variabile de sesiune), in care acestea se salveaza la incheierea fiecarei cereri si se incarca inapoi la urmatoarea cerere care este detectata a veni de la acelasi client. Mecanismul de stocare este dublat de unul de identificare a clientului, care permite serverului sa recunoasca cereri disparate ca venind de la acelasi client (vezi sectiunea despre sesiuni). Felul in care se face salvarea informatiilor de sesiune este configurabil de catre administratorul serverului web si al modulului de PHP (se poate face in fisiere, baze de date etc.)