MadaLino
Moderator
 Din: Hotel Paradis
Inregistrat: acum 17 ani
Postari: 240
|
|
După cum probabil ştiţi, anumite site-uri au accesul restricţionat şi conţinutul lor poate fi accesat numai de către anumite persoane autorizate. Una dintre variantele prin care poate fi verificat faptul dacă un anumit utilizator are dreptul de a accesa un anumit site este cererea introducerii unui nume de utilizator şi a unei parole în momentul în care persoana respectivă încearcă să acceseze aceste informaţii. În momentul acceasării paginii web este trimis un mesaj care indică faptul că autentificarea este necesară. Programul de navigare va afişa o casetă de dialog care permite introducerea unui nume de utilizator şi a unei parole. După introducerea informatiilor necesare va fi accesată din nou pagina web dar, de această data, variabilele predefinite PHP_AUTH_USER, PHP_AUTH_PW şi PHP_AUTH_TYPE vor conţine numele de utilizator, parola, respectiv tipul autentificării. Pentru a trimite mesajul care cere autentificarea este utilizată funcţia header() . Nu este posibilă decât autentificarea de tip "Basic". Un exemplu în care este prezentată o autentificare înaintea accesării informaţiilor este prezentat în continuare:
Cod:
<?php if (!isset($_SERVER['PHP_AUTH_USER'])) { header ('WWW-Authenticate: Basic realm="php4"'); header ('HTTP/1.0 401 Unauthorized'); echo 'Pentru accesarea continutului este necesara o autentificare!'; exit; } else { echo "<html><head>"; echo "<title>Autentificare</title>"; echo "</head><body>"; echo "<p>Salut <b><i>{$_SERVER['PHP_AUTH_USER']}</i></b>!</p>"; echo "<p>Parola introdusa este <b><i>{$_SERVER['PHP_AUTH_PW']}</i></b>.</p>"; echo "</body></html>"; } ?>
Rezultatul codului de mai sus îl puteţi vedea dând clik aici.
Pentru o compatibilitate cât mai mare, cuvântul Basic trebuie scris cu majusculă, valoarea pentru realm trebuie să fie cuprinsă între ghilimele (nu între apostrofuri), iar între HTTP/1.0 şi 401 trebuie să existe exact un spaţiu. În acest exemplu, numele de utilizator şi parola sunt afişate. În practică, se va verifica validitatea lor, de obicei printr-o interogare a unei baze de date. În situaţia în care este apăsat butonul Cancel, pagina web generată va conţine un mesaj de avertizare.
Funcţia setcookie.
În PHP există o funcţie specială care poate fi folosită pentru crearea cookie-urilor şi anume setcookie(). Funcţia defineşte un cookie care va fi trimis împreună cu celelalte headere HTTP. Ca şi alte headere, cookies trebuie trimis înaintea oricărui caracter din script (aceasta deoarece există o restricţie de protocol, nu se poate trimite conţinutul paginii şi apoi headerul, headerele trebuiesc trimise primele, înaintea oricărui mesaj). Dacă a fost trimis ceva la browser (chiar şi un simplu spaţiu blank) înainte de apelarea acestei funcţii, setcookie() va genera un mesaj de eroare de tipul FALSE. Dacă setcookie() a putut genera cu succes cookie-ul, va returna TRUE. Aceasta nu indică dacă userul a acceptat sau nu cookie, ci doar că a fost generat şi trimis cu succes. Începând de la php4, puteţi folosi funcţiile ob_start() la începutul scriptului şi ob_end_flush() la sfârşitul scriptului pentru a se genera un buffer cu tot ce trebuie trimis la browser, şi astfel la sfârşit se vor trimite toate odată, începând cu headerele şi continuând cu restul paginii, indiferent dacă în script aţi trimis întâi text şi apoi headere (folosind prima funcţie, buffer-ul se va genera pe măsură ce primeşte date, iar la sfârşit, când se cere închiderea buffer-ului prin apelarea celei de-a doua funcţii - ob_end_flush() - , headerele se vor trimite primele apoi restul buffer-ului). O altă variantă este de a seta directiva output_buffering din php.ini (în fişierul de configurare al serverului). Funcţia setcookie() are şase parametri, doar prezenţa primului parametru fiind obligatorie. Sintaxa este:
setcookie(nume, valoare, expirare, cale, domeniu, securitate);
Parametru Descriere Exemplu nume şir de caractere care reprezintă numele cookie-ului 'nume_cookie' va fi apelat ca $_COOKIE['nume_cookie'] valoare şir de caractere care reprezintă valoarea cookie-ului (informaţia corespunzătoare), care va fi salvat pe calculatorul clientului (nu trimiteţi date sensibile, gen parola) Presupunând că numele este 'cookiename', valoarea va fi preluată prin $_COOKIE['cookiename'] expirare un număr întreg care indică momentul de timp în care cookie-ul nu va mai putea fi utilizat. Valoarea este în format "Unix timestamp", adică se poate seta folosind funcţia time() plus numărul de secunde până când doriţi să expire, sau puteţi folosi mktime(). time()+60*60*24*30 va seta cookie să expire în 30 de zile. Dacă nu e setat, cookie va expira la terminarea sesiunii curente (când se închide browserul) cale şir de caractere care reprezintă o cale generică a fişierelor care pot accesa cooke-ul Dacă este setată ca '/', cookie va fi accesibil pentru întreg domeniu. Dacă este setat ca '/foo/', atunci cookie va fi accesibil doar pentru fişierele şi scripturile din directorul /foo/ (de pe server) înclusiv toate sub-directoarele acelui director, cum ar fi /foo/bar/. Valoarea standard este setată ca directorul curent (directorul curent adică directorul în care există scriptul care a setat acel cookie). domeniu şir de caractere care reprezintă domeniul pe care trebuie stocate fişierele care pot accesa cookie-ul Pentru a face cookie disponibil pentru toate subdomeniile, de exemplu domeniu.com puteţi seta astfel '.domeniu.com'. Punctul dinainte nu este neaparat necesar, dar îl face compatibil cu mai multe browsere. Setând ca veţi face cookie-ul disponibil doar pentru sub-domeniul www. Pentru alte detalii vedeţi specificaţiile de aici. securitate număr întreg care, dacă are valoarea 1 (TRUE), arată că informaţia poate fi transmisă doar folosindu-se o conexiune HTTPS securizată. Setarea de bază este 0 (FALSE) 0 sau 1
Dacă unul dintre parametri este prezent, atunci toţi parametrii anteriori trebuie să fie prezenţi. Dacă unul dintre aceştia nu este utilizat, se va folosi în poziţia respectivă fie şirul vid, fie valoarea 0. În continuare sunt prezentate câteva exemple de apeluri prin care sunt create cooke-uri:
- setcookie ("TestCookie", "PHP4" ; - setcookie ("TestCookie", "Site", time()+3600); // expiră dupa o oră de la creare - setcookie ("TestCookie", "Test", time()+3600, "/articole/", ".php4.as.ro",1);
Cu ajutorul funcţiei setcookie() este posibilă şi ştergerea cookie-urilor. Următoarele exemple ilustrează modul în care poate fi realizată această operaţie:
setcookie ("TestCookie", "", time()-3600);
sau
setcookie ("TestCookie", "", time()-3600, "/comenzi/", ".php4.as.ro", 1);
Se observă că momentul expirării este setat ca fiind anterior momentului executării operaţiei de stergere. Există posibilitatea de a crea şiruri de cookie-uri prin simpla introducere a parantezelor drepte în denumiri. Un exemplu de creare şi utilizare a unor astfel de şiruri este prezentat în continuare:
Cod:
<?php setcookie ("cookie[three]", "cookiethree" ; setcookie ("cookie[two]", "cookietwo" ; setcookie ("cookie[one]", "cookieone" ; if (isset ($cookie)) { while (list($name,$value)=each($cookie)) { echo "$name == $value<br>"; } } ?>
Pentru a accesa cookie-urile stocate pe calculatorul unui vizitator al paginii Web, este disponibil vectorul $_COOKIE. Voi prezenta în continuare un exemplu cu ajutorul căruia se generează o pagină care conţine denumirile şi valorile tuturor cookie-urilor.
Cod:
<?php foreach ($_COOKIE as $cheie=>$valoare) { echo "$cheie = $valoare<br>"; } ?>
Fişierele pot fi încărcate pe un server dacă utilizatorul foloseşte un program de navigare compatibil RFC-1867; pot fi utilizate ultimile versiuni ale celor mai cunoscute browsere. Este posibilă încărcarea atât a fişierelor text, cât şi a celor binare. Folosind autentificarea PHP şi funcţiile de manipulare a fişierelor, avem controlul total asupra utilizatorilor care pot încărca fişiere şi asupra operaţiilor efectuate cu fişierul încărcat.
Formularul de încarcare (upload)
Pentru ca utilizatorul să poată încărca un fişier, el trebuie să aibă la dispoziţie un formular care să permită alegerea fişierului. Un astfel de formular poate fi creat, de exemplu, folosind limbajul HTML standard. În continuare este prezentat un document HTML care generează o pagina web care permite alegerea unui fişier şi încărcarea sa pe un server.
Cod:
<html> <head> <title>Incarcarea unui fisier pe server</title> </head> <body> <form enctype="multipart/form-data" action="upload.php" method="post"> Alegeti fisierul: <br> <input name="fisier" type="file"> <input type="hidden" name="MAX_FILE_SIZE" value="1024"><br> <input type="submit" value="Trimite fisierul!"> </form> </body> </html>
Butonul Browse... poate fi utilizat pentru alegerea unui fişier care urmează a fi încărcat. Este posibilă specificarea fişierului precizând exact calea în caseta de text afişată. URL-ul care este folosit ca valoare pentru atributul action al marcajului <from> trebuie să reprezinte documentul php care va realiza încărcarea.
Operatia de încarcare (upload)
Aşadar, formularul prin intermediul căruia este ales fişierul va fi prelucrat de către un script PHP. Pentru a manipula fişierele poate fi utilizat tabloul $_FILES. Pentru script-ul care prelucrează formularul prezentat anterior, informaţiile referitoare la fişierul încărcat vor fi acceasate folosind variabila $_FILES['fisier'] care este tot un vector. Elementele acestui vector sunt prezentate în cele ce urmează:
- $_FILES['fisier'] ['name'] numele pe care îl are fişierul pe calculatorul utilizatorului; - $_FILES['fisier'] ['tmp_name'] numele temporar pe care îl are fişierul pe server după încheierea procesului de încărcare; - $_FILES['fisier'] ['type'] tipul fişierului în cazul în care programul de navigare furnizează această informaţie; un exemplu ar putea fi image/gif; - $_FILES['fisier'] ['size'] dimensiunea fişierului, exprimată în bytes; - $_FILES['fisier'] ['fisier'] ['error'] un cod de eroare generat în urma efectuării încărcării.
Fişierul va fi stocat pe server în directorul care conţine fişierele temporare. O secvenţă de instrucţiuni PHP care poate fi folosită pentru a prelucra fişierul încărcat şi a-l muta în directorul dorit este următoarea:
Cod:
<?php if (is_uploaded_file($_FILES['fisier']['tmp_name')) { copy($_FILES['fisier']['tmp_name'],"/directorul/dorit" ; } else { echo "Eroare de transfer ".$_FILES['fisier']['name']; } ?>
O variantă alternativă ar fi:
Cod:
<?php move_uploaded_file($_FILES['fisier']['tmp_name'],"/directorul/dorit" ; ?>
Coduri de eroare
Începând cu versiunea PHP 4.2.0, în urma efectuării unui transfer, sunt generate anumite coduri de eroare. Versiunea 4.3.0 introduce constante predefinite pentru fiecare dintre aceste coduri. În funcţie de codul de eroare generat în urma operaţiei, trebuie realizate diferite acţiuni. Codul de eroare poate fi accesat prin intermediul elementului ['error'] al vectorului care păstrează informaţiile despre fişier. Codurile de eroare care pot fi generate sunt următoarele:
- UPLOAD_ERR_OK (0) nu a fost semnalată nici o eroare în timpul transferului; operaţia de încărcare s-a încheiat cu succes; - UPLOAD_ERR_INI (1) dimensiunea fişierului este mai mare decât valoarea maximă permisă (această valoare este specificată în momentul configurării server-ului şi poate fi schimbată modificând fişierul PHP.INI); - UPLOAD_ERR_FORM_SIZE (2) dimensiunea fişierului este mai mare decât valoarea maximă indicată de directiva MAX_FILE_SIZE care este specificată în formular; această valoare este specificată prin intermediul unui câmp ascuns al cărui text este MAX_FILE_SIZE; - UPLOAD_ERR_PARTIAL (3) fişierul a fost încărcat doar parţial; - UPLOAD_ERR_NO_FILE (4) nu a fost încărcat nici un fişier.
Încărcarea mai multor fişiere
Există posibilitatea de a încărca mai multe fişiere dacă sunt folosite nume diferite pentru marcajul <input> utilizat pentru afişarea casetei de text şi a butonului folosite pentru alegerea fişierului. De asemenea, este posibil ca fişierele încărcate să fie organizate automat într-un vector. Pentru aceasta, la numele folosite trebuie adaugate caracterele ' [ ] '. Un exemplu este prezentat în continuare:
Cod:
<?php <form action="upload.php" method="post" enctype="multipart/form-data"> Alegeti fisierele:<br> <input name="fisiere[]" type="file"> <br> <input name="fisiere[]" type="file"> <br> <input type="submit" value="Trimite fisierele"> </form> ?>
Să presupunem că am ales să încărcăm fişierele POZA1.GIF şi DOC1.PDF. În acest caz, $_FILES['fisiere']['name'][0] va avea valoarea POZA1.GIF, în timp ce $_FILES['fisiere']['name'][1] va avea valoarea DOC1.PDF. Dimensiunile celor două fişiere pot fi determinate folosind valorile $_FILES['fisiere']['size'][0], respectiv $_FILES['fisiere']['size'][1].
Includerea fişierelor
Deseori, mai multe pagini web pe care le creăm trebuie să conţină secvenţe identice. Evident, putem copia secvenţele dintr-un fişier în altul, dar această varianta, pe lângă faptul că este incomodă, duce la un consum mărit de spaţiu pe server şi, în cazul în care secvenţele sunt lungi sau sunt folosite în foarte multe pagini, problema este destul de importantă. Interpretorul PHP permite păstrarea secvenţelor comune în fişiere separate şi accesarea acestora din cadrul altor documente PHP. Pentru a accesa un astfel de fişier, poate fi utilizată directiva include(). Practic, din punct de vedere logic, tot conţinutul fişierului inclus este inserat în poziţia în care apare directiva. Sintaxa acestei directive este include(fisier);. Să presupunem că avem un fişier numit HELLO.TXT cu următorul conţinut:
Cod:
<?php echo "Pagina de test"; ?>
În continuare aveţi un model în care puteţi vedea cum poate fi inclus acest fişier într-un document php.
Cod:
<head> <title>Pagina cu fisier inclus</title> </head> <body> <?php include("HELLO.TXT" ; ?> </body> </html>
Pentru ca fişierul inclus să fie interpretat, acesta trebuie obligatoriu să indice faptul că secvenţele de text din cadrul său reprezintă instrucţiuni php. Aşadar, prezenţa construcţiei <?php... ?> este necesară pentru ca textul să fie interpretat corect. Dacă fişierul HELLO.TXT ar conţine doar secvenţa echo "Pagina de test";, atunci acesta nu ar fi interpretat ca fiind cod php, ci ca fişier html. Aceasta se datorează faptului că în momentul includerii unui fişier se iese din modul PHP şi tot textul este interpretat ca fiind cod HTML. După interpretarea textului din fişierul inclus se intră din nou în modul PHP. În concluzie, folosirea celor două fişiere este echivalentă cu utilizarea următorului fişier:
Cod:
<head> <title>Pagina cu fisier inclus</title> </head> <body> <?php echo "Pagina de test"; ?> </body> </html>
Includerea în cadrul funcţiilor
Dacă directiva de includere apare în cadrul unei funcţii, atunci se consideră că toate instrucţiunile din cadrul fişierului inclus fac parte din corpul funcţiei. Aşadar, domeniul de vizibilitate al variabilelor folosite în fişierul inclus este acelaşi cu domeniul pe care l-ar fi avut dacă ar fi apărut în cadrul funcţiei. Pentru a ilustra acest aspect vom considera un fişier var.txt care conţine secvenţa:
Cod:
<?php $culoare = "verde"; $fruct = 'mar'; ?>
şi următorul document PHP:
Cod:
<?php function fructe() { global $culoare; include('var.txt'); echo "un $fruct $culoare<br>"; } fructe(); echo "un $fruct $culoare<br>; ?>
Rezultatul va fi:
un mar verde un verde
După cum se poate vedea, variabilele definite în cadrul fişierului inclus au domeniul de vizibilitate corespunzător funcţiei fructe(). Din aceste motive valoarea variabilei $fruct nu este disponibilă în afara funcţiei. Valoarea variabilei $culoare este disponibilă şi în afara funcţiei, deoarece a fost declarată ca fiind o variabilă globala. Aşadar, instrucţiunea echo din cadrul funcţiei duce la afişarea mesajului
un mar verde,
deoarece ambele valori ale variabilelor sunt disponibile, iar instrucţiunea din afara funcţiei duce la afişarea mesajului
un verde,
deoarece, în afara funcţiei, variabila $fruct nu a fost definită anterior şi este automat iniţializata cu şirul vid.
Includeri prin HTTP
După cum aţi observat, directiva include are ca parametru un şir de caractere care conţine numele fişierului care va fi inclus. Acesta poate fi orice URL valid, aşadar este posibilă includerea unui fişier aflat pe un alt server. Un exemplu ar putea fi include("http://www.site-ul.meu/pagina.mea" ;. O astfel de directivă funcţioneaza doar dacă se foloşeste PHP 4.3.0 sau o versiune ulterioară.
Includerea unui fişier o singură dată
Uneori, mai ales în situaţiile în care se folosesc variabile pentru numele fişierelor incluse, este posibil ca anumite fişiere să fie incluse de mai multe ori. De obicei, fişierele incluse conţin definiţii ale unor funcţii sau clase, motiv pentru care este de dorit ca un astfel de fişier să nu fie inclus de mai multe ori. Pentru ca un fişier să fie inclus o singură dată, se utilizează o directiva alternativă numită include_once. După cum rezultă din denumire, un fişier va fi inclus o singură data. Cu alte cuvinte, în momentul în care se cere includerea unui fişier, se verifică dacă acesta a fost deja inclus şi în această situaţie directiva nu are nici un efect (fişierul nu este inclus încă o dată . Alternative: Pe lângă directivele includeşi include_once există două alte directive a căror utilizare are un efect aproape echivalent. Acestea sunt require (echivalentă cu include) şi require_once (echivalentă cu include_once). Singura diferenţa dintre include şi require (respectiv dintre include_onceşi require_once) este dată de modul în care este tratată situaţia în care fişierul care se doreşte a fi inclus nu există sau nu este disponibil. În cazul directivelor include şi include_once este generat un avertisment şi execuţia script-ului continuă fără ca fişierul să fie inclus. Practic, din punct de vedere logic, este ignorată directiva. În cazul directivelor require şi require_once este generată o eroare fatală şi execuţia script-ului este întreruptă. Aşadar, în situaţiile în care este absolut necesară existenţa fişierului, pentru a nu apărea efecte bizare, trebuie utilizată directiva require, respectiv require_once.
Starea conexiunii
În PHP, conexiunea poate avea una dintre cele trei stări posibile: - NORMAL (0) starea normală de funcţionare; - ABORTED (1) utilizatorul care accesează pagina generată de script-ul aflat în execuţie s-a deconectat (de obicei prin apăsarea butonului Stop al programului de navigare); - TIMEOUT (2) a fost atinsă limita de timp impusă de PHP.
Pentru fiecare dintre cele trei stări există un indicator (flag) care este setat sau nu în funcţie de starea conexiunii. În funcţie de script, este necesar sau nu ca execuţia acestuia să se incheie în momentul în care este întreruptă conexiunea. De exemplu, în cazul în care script-ul actualizează o bază de date ar fi de dorit ca execuţia să continue. În principiu, este indicat ca script-urile să îşi încheie execuţia chiar dacă datele de ieşire nu vor mai fi trimise utilizatorului. Pentru a decide dacă execuţia script-ului se va încheia în momentul întreruperii conexiunii puteţi (sau nu!) să apelaţi funcţia ignore_user_abort(). Implicit, în momentul în care conexiunea este întreruptă, se întrerupe şi execuţia script-ului. Este posibil (chiar recomandabil!) să fie definită o funcţie care va fi executată înaintea întreruperii execuţiei script-ului. Aceasta poartă denumirea de funcţie de dezactivare (shutdown function) şi este definită la fel ca orice altă funcţie. Pentru a specifica faptul că o anumită funcţie trebuie apelată înaintea intreruperii execuţiei, aceasta trebuie înregistrată ca fiind funcţie de dezactivare. Aceasta se realizează printr-un apel al funcţiei registrer_shutdown_function(). În cadrul funcţiei se poate testa dacă execuţia a fost determinată de întreruperea conexiunii prin apelarea funcţiei connexion_aborted(). Aceasta va returna valoarea TRUE dacă a fost întreruptă conexiunea. Funcţia de dezactivare va fi apelată automat şi în cazul în care este depăşită limita de timp. În cadrul funcţiei se poate testa dacă un astfel de eveniment a avut loc prin apelarea funcţiei connection_aborted() care returnează valoarea TRUE în cazul depăşirii acestei limite. Există posibilitatea de a testa ambele indicatoare printr-un singur apel al funcţiei connection_status(). Funcţia va returna un număr întreg ai cărui biţi reprezintă indicatoarele. De exemplu, dacă sunt setate indicatoarele ABORTED şi TIMEOUT, valoarea returnată va fi 3. Trebuie remarcat faptul că este posibil ca indicatorii ABORTED şi TIMEOUT să fie ambii setaţi la un moment dat. Această situaţie poate apărea în cazul în care întreruperea conexiunii este ignorată. PHP va detecta faptul că a fost întreruptă conexiunea şi va seta indicatorul corespunzător. Totuşi, execuţia script-ului va continua şi este posibil să expire şi limita de timp, moment în care este setat şi indicatorul TIMEOUT. Implicit, limita de timp este de 30 de secunde, dar ea poate fi modificată folosind funcţia set_time_limit().
Fişiere aflate la distanţă
Aşa cum am spus în secţiunea dedicată includerii fişierelor, începând cu versiunea PHP 4.3.0 este posibilă includerea de fişiere aflate pe alte servere. Evident, este posibilă utilizarea de fişiere aflate pe alte servere şi în alte scopuri. Practic, în aproape toate funcţiile care manipulează fişiere, pot fi folosite atât fişiere locale, cât şi fişiere aflate la distanţă. În continuare este prezentat modul în care pot fi citite date dintr-un fişier aflat pe server:
Cod:
<?php // accesam fisierul si setam atributul r de la citire (read) $file = fopen("locatia/fisierului/nume_fisier.extensia", "r" ; if(!$file) { echo "Fisierul nu poate fi accesat!\n"; exit; } // citirea datelor din fisier // inchiderea fisierului fclose ($file); ?>
Pentru a scrie în fişier se poate folosi o secvenţă de tipul:
Cod:
<?php // accesam fisierul si setam atributul w de la scriere (write) $file=fopen("locatia/fisierului/nume_fisier.extensia", "w" ; if(!$file) { echo "Fisierul nu poate fi accesat!\n"; exit; } // scrierea datelor in fisier // inchiderea fisierului fclose ($file); ?>
Puteţi folosii aceste idei pentru a creea o pagină cu acces restricţionat, şi unde să scrieţi într-un fişier pe server datele vizitatorului (cum ar fi adresa lui de ip, host, timpul cât a stat pe pagina respectivă, ce pagini a vizitat etc...).
_______________________________________

" Cui nu-i place cum gandesc multa ii doresc ! "

|
|