Invata PHP cu punctsivirgula.ro

I. Introducere
II. Notiuni de baza
III. Notiuni avansate
IV. Aplicatii
V. Extra
C O N T I N U T
Headere

Headere    1 ! 

Headerele sunt elemente prin care browser-ul si serverul web comunica in fundal pentru a afisa o pagina web in bune conditii.

Exista 2 tipuri de headere: cele emise de browser (headere de request) si cele emise de server (headere de raspuns).


Request headers

De fiecare data cand un utilizator acceseaza o pagina web, browserul trimite catre server cantitati mici de date, sub forma request headers (sau, intr-o traducere destul de rar folosita la noi, antetelor de cerere). Aceste antete cuprind detalii despre pagina care a fost solicitata, modul de transfer a ei, precum si informatii despre capabilitatile browser-ului.

De exemplu, cand ati accesat aceasta pagina, browser-ul dvs a trimis catre server urmatoarele headere de request:

GET /http/ HTTP/1.1
Host: php.punctsivirgula.ro
Connection: close
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ro; rv:1.9.1) Gecko/20090624 Firefox/3.5
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7
Cache-Control: no
Accept-Language: de,en;q=0.7,en-us;q=0.3

Headerele sunt trimise de browser in mod implicit, utilizatorul nu trebuie sa faca ceva anume pentru asta. De asemenea, headerele nu pot fi (usor) modificate inainte de a fi trimise.


Response headers

In raspuns la request headers primite de la browsere, serverele web trimit inapoi 2 tipuri de informatie:

  • headere de raspuns (response headers)
  • continutul efectiv al paginii solicitate (continut ce poate fi construit/modificat prin intermediul PHP)

Headerele de raspuns contin informatii despre pagina solicitata (cum ar fi: daca exista sau nu, dimensiunea ei, tipul de continut, etc).

De exemplu, in urma solicitarii acestei pagini in browser, serverul nostru a trimis urmatorul raspuns:

HTTP/1.1 200 OK
Date: Fri, 17 Jul 2009 14:54:18 GMT
Server: Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.8b PHP/5.2.6 mod_scgi/1.12
X-Powered-By: PHP/5.2.6
Set-Cookie: PHPSESSID=h8144gj13180725c2aufkrd397; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>Ghid PHP pentru incepatori - headere. cookies. modificarea requestului HTTP</title>
....
</html>

Headerele reprezinta prima parte, separate de continut prin 2 linii goale (reprezentate prin caracterele \r\n\r\n). Din acest raspuns, browserul "stie" sa interpreteze headerele si sa afiseze in pagina doar continutul, astfel ca antetele nu vor fi niciodata vizibile utilizatorului final.

La fel ca in cazul antetelor de cerere, cele de raspuns sunt trimise in mod automat de catre server, inainte de a trimite continutul si nu este nevoie ca programatorul sa intervina. Exista insa situatii cand trebuie ca anumite antete sa fie modificate. Acest lucru este posibil cu ajutorul limbajului PHP.

PHP ofera posibilitatea modificarii headerelor de raspuns prin intermediul functiei header.

# trimiterea unui semnal (Not-Found, Status OK, etc)
header( 'HTTP/1.0 404 Not Found' );  // spune browserului sa afiseze un mesaj de eroare
header( 'HTTP/1.0 200 OK' );  // anunta ca pagina exista si va fi trimisa catre browser
 
# redirectionare - "spune" browserului sa "mearga" la alta adresa
header( 'Location: http://www.punctsivirgula.ro/' );
 
# specificarea tipului paginii ce se va afisa - in urma acestor apeluri, browser-ul va
# astepta alte tipuri de continut decat pagini HTML
header( 'Content-type: application/pdf' ); // browserul va astepta sa fie trimis un PDF
header( 'Content-type: text/css' ); // fisier css
periferigelerimini a spus good work - 17.02.2014

- scuze pentru name-email, dar vreau sa raman anonim.
- tnx pentru munca depusa sa faci acest tutorial, este foarte util.
- daca vreodata o sa fac ceva bani in viata asta mea amarata, te voi recompensa :)


Adauga un comentariu la aceasta sectiune.

 


Aplicatie: Sa se redirectioneze un utilizator la o anumita pagina    8 ! 

<?php
# daca este definit un site, fac redirectarea
if( isset( $_GET[ 'site' ] ) ) {
	# folosesc instructiunea de selectie multiple
	switch( $_GET[ 'site' ] ) {
	case 'home':
		header( 'Location: /');
		break; # break este necesar dupa fiecare 'ramura' a lui switch 
	case 'search':
		header( 'Location: http://www.google.ro' );
		break;
	default: # daca nici una din conditiile de mai sus nu a fost indeplinita
		header( 'Location: http://www.punctsivirgula.ro' );
	}
	exit; # dupa header() trebuie oprita executia scriptului
}
?>
 
<a href="page.php?site=home">home</a>
<a href="page.php?site=search">search</a>
<a href="page.php?site=bla">other</a>

Important! Inainte de folosirea instructiunii header() nu trebuie sa fie afisat nimic (cu print, echo, sau scriind cod HTML). Se intampla adesea ca si un spatiu ramas la sfarsitul unui fisier inclus cu include sau require sa opreasca functia de la a functiona corect. De exemplu, urmatoarele secvente de cod nu sunt valide:

<?php
print "Nu mai pot trimite headere";
header( "Location: http://www.google.ro" );
exit;
?>
<html>
<body>
<?php
header( "Location: /" );
exit;
?>
serge a spus primul exemplu nevalid merge - 23.05.2012

<?php
print "Nu mai pot trimite headere";
header( "Location: http://www.google.ro" );
exit;
?>

sergiu a spus cind dau click pe search trebuie sa ma redictioneze pe google.ro? - 23.05.2012

imi da eroare Object not found!

Alexandru a spus Pentru Serge - 23.05.2012

Exemplul nevalid functioneaza deoarece PHP face un fel de buffering la textul afisat cu "print". In mod normal, daca dupa instructiunea print se pune un flush() atunci n-ar mai merge.

Kelu a spus probleme cu spatiile la "Include" - 16.02.2013

"Se intampla adesea ca si un spatiu ramas la sfarsitul unui fisier inclus cu include sau require sa opreasca functia de la a functiona corect."

Pentru a nu intampina astfel de probleme eu nu folosesc "?>" decat in interior, nu si la sfarsit. Astfel se ia in considerare totul pana la ultimul caracter(si nu pana la ?>). Eventualele spatii albe sau 'Enter-uri' de la sfarsit nu vor fi luate in considerare.

Nicusor a spus Object not fount! - 28.05.2013

Aceasi eroare o am si eu la click pe search, home sau other ca si sergiu

Alexandru a spus Object not found - 13.06.2013

Fisierul vostru trebuie sa se numeasca page.php pentru ca primul exemplu sa functioneze. Altfel veti primi acea eroare.

Alex a spus Object not found - Rezolvare - 23.01.2014

Aceasta eroare Object not found apare pentru ca http://www.google.ro nu e scris correct!
Incercati cu asta: https://www.google.ro Nu uitati sa adaugati acel https pentru site-uri securizate!

Marius a spus Al doi-lea link - 30.09.2015

In exemplul tau link-ul doi se numeste tot home, ar trebui sa se numeasca search


Adauga un comentariu la aceasta sectiune.

 


Aplicatie: Sa se creeze o pagina care ofera spre download un document PDF, in loc sa-l deschida in browser    2 ! 

Probabil ca multi dintre voi ati observat ca browserele afiseaza documentele PDF sau imaginile direct in cadrul ferestrei, iar pentru a le descarca trebuie ales in mod explicit optiunea de Save din meniul browserului. Acest comportament poate fi schimbat prin headere. Daca serverul web i-ar "spune" browserului ca ceea ce se va transmite trebuie downloadat si nu afisat atunci problema ar fi rezolvata. Sa creem asadar fisierul download.php

<?php
# pagina download.php va primi ca parametru numele fisierului
# forma unui link va fi urmatoarea: download.php?file=document.pdf
 
if( isset( $_GET[ 'file' ] ) ) {
	# curat calea fisierului pentru a elimina riscurile de atacuri
	$_GET[ 'file' ] = preg_replace( '/\.\.\//', '', $_GET[ 'file' ] );
 
	# daca a fost trimis un fisier verific daca exista
	if( !is_file( $_GET[ 'file' ] ) ) {
		# daca fisierul nu exista, trimit un semnal corespunzator
		header( "HTTP/1.0 404 Not Found" );  # timit un mesaj de eroare
 
		print "<html><title>Document inexistent</head>
			<body><h1>Documentul nu a fost gasit.</h1>Parametrul  
			<tt>file</tt> trebuie sa specifice un fisier existent in 
			folderul curent. Incercati din nou.</body></html>";
 
		exit; # opresc executia aici
	}
 
	# daca s-a ajuns aici, inseamna ca fisierul exista
 
	# preiau extensia pentru a-i determina tipul
	$type = strrchr($_GET[ 'file' ], '.' ); # preiau textul de la ultimul punct la final
	# $type va fi acum ceva de genul ".pdf"
	if( strlen( $type ) ) $type = substr( $type, 1 ); # elimin punctul
 
	# in functie de tip, trimit browserului un anumit Content-Type
	# este necesar pentru ca browserul sa stie ce tip de fisier va fi descarcat
	switch( $type ) {
	case 'pdf':
		header( 'Content-type: application/pdf' ); // fisierul va fi PDF
		break; # break este necesar dupa fiecare 'ramura' a lui switch 
	case 'gif':
		header( 'Content-type: image/gif' );
		break;
	case 'jpg':
		# daca nu specific un break se va executa instructiunea de la urmatoarea
		# ramura 'case'. 
		# Cu alte cuvinte pentru 'jpg' si 'jpeg' este aceeasi instructiune
	case 'jpeg':
		header( 'Content-type: image/jpeg' );
		break;
	case 'html': # fisierul HTML va fi oferit spre download in loc sa fie afisat
		header( 'Content-type: text/html' );
		break;
	case 'php':
		header( 'Content-type: application/x-httpd-php' );
		break;
	/*
		aici pot fi definite oricate conditii
	*/
	default: # daca nici una din conditiile de mai sus nu a fost indeplinita
		# afisez ca text
		header( 'Content-type: text/plain' );
	}
 
	# trimitem headerul prin care "fortam" download-ul. Partea "filename" din textul 
	# de mai jos specifica numele sub care va fi propus spre download fisierul
	header("Content-Disposition: attachment; filename=\"download.$type\"");
 
	# trimit continutul fisierului de descarcat
	readfile( '.'.DIRECTORY_SEPARATOR.'resurse'.DIRECTORY_SEPARATOR.$_GET[ 'file' ] );
	# alternativ de poate folosi
	// echo file_get_contents( './resurse/' . $_GET[ 'file' ] );
	# nota: se pot specifica doar fisiere din folderul 'resurse', orice incercare de
	# a accessa alte fisiere este blocata
 
} else {
	# nu a fost transmis parametrul file, fac redirect la pagina principala
	header( "Location: /" );
}
exit; /* intrerup executia, desi nu e necesar in aceasta situatie fiind deja la 
sfarsitul scriptului */
?>
Puteti testa "in actiune" acest cod urmand urmatoarele link-uri:

Descarcati fisierul PHP si incercati-l pe serverul vostru.

Monica M a spus Mersi - 24.07.2010

Multumesc pentru fisier!Nu reuseam deloc sa downloadez fisierele care le bagasem deja in baza(doar calea). M-ai salvat!!

Nicusor a spus Nu functioneaza - 28.05.2013

am incercat pe serverul meu local acest cod si nu imi functioneaza. daca intru pe adresa locala si din click pe folderul creat pentru documentul pdf si acest script php, in momenutl in care dau clik pe download.php, iese din folder si nu se intampla nimic :|


Adauga un comentariu la aceasta sectiune.