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 ! 

home search other

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:

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

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 */ ?> </code> Puteti testa "in actiune" acest cod urmand urmatoarele link-uri: <ul class="list"> <li><a href="/public/resurse/install_cl-sr.jpg" rel="nofollow">Imagine jpeg - link direct</a></li> <li><a href="/public/resurse/download.php?file=install_cl-sr.jpg" rel="nofollow">Imagine jpeg - link de download</a> </li> <li><a href="/public/resurse/document.pdf" rel="nofollow">Document PDF - link direct</a></li> <li><a href="/public/resurse/download.php?file=document.pdf" rel="nofollow">Document PDF - link de download</a> </li> </ul> <p class="text-block"> <a href="/public/resurse/download.php?file=download.php" rel="nofollow">Descarcati fisierul PHP si incercati-l pe serverul vostru.</a> </p> <div id="comments_bar_download" class="commentsBar"> <div class="commentsBarTitle"> <img src="//static.punctsivirgula.ro/img/ghid-all/comentariu.png" alt="comentarii" /> <a href="#sc_download" name="lsc_download" id="lsc_download" rel="toggle-sc_download" > 2 comentarii </a>   <a href="#sc_download" onclick="animatedcollapse.show( 'sc_download' ); return false;" class="addclink"><small style="text-decoration: underline;"> Citeste-le</small></a>   <a href="#toggle_ac_download" rel="download" class="addclink"><small style="text-decoration: underline;"> Adauga unul </small></a> </div> <div id="sc_download"><div class="commentsHolder"><strong>Monica M</strong> a spus <strong>Mersi</strong> - 24.07.2010<br /><p>Multumesc pentru fisier!Nu reuseam deloc sa downloadez fisierele care le bagasem deja in baza(doar calea). M-ai salvat!! </p></div><div class="commentsHolder"><strong>Nicusor</strong> a spus <strong>Nu functioneaza</strong> - 28.05.2013<br /><p>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 :|</p></div> <br /><a href="#ac_download" id="toggle_ac_download" rel="toggle-ac_download" style="text-decoration: underline;">Adauga un comentariu la aceasta sectiune.</a><br /><br /> <div id="ac_download"> <form action="" id="fc_download" method="post"> <fieldset><table> <tr> <td><label for="nume_download">Nume <span class="required">*</span></label></td> <td><input id="nume_download" name="nume" title="Numele care va fi afisat pe site" /></td> <td></td> </tr><tr> <td><label for="email_download" title="Folosit exclusiv pentru notificari">Email <small>(va fi ascuns)</small></label></td> <td><input name="email" id="email_download" /></td> <td></td> </tr><tr> <td><label for="website_download">Website</label></td> <td><input name="website" id="website_download" /></td> <td></td> </tr><tr> <td><label for="titlu_download">Titlul mesajului<span class="required">*</span></label></td> <td><input id="titlu_download" name="titlu"/></td> <td></td> </tr><tr> <td><label for="comentariu_download">Comentariu <span class="required">*</span></label></td> <td><textarea id="comentariu_download" name="comentariu" title="Introduceti comentariul" rows="5" cols="30"></textarea></td> <td></td> </tr><tr> <td colspan="3"> <input type="hidden" value="c" name="tip" /> <input type="hidden" value="download" name="s" /> <input type="hidden" value="http " name="p" /> <input type="submit" class="submit" value="Trimite"/>   <img style="display: none" id="fc_l_download" src="//static.punctsivirgula.ro/img/ghid-all/ajax-snake.gif" alt="loading..." /> </td> </tr> </table></fieldset> </form> </div> </div> </div> <script type="text/javascript"> animatedcollapse.addDiv('sc_download', 'fade=0,speed=200,hide=1,group=sg_download,persist=1,hilite=bold'); animatedcollapse.addDiv('ac_download', 'fade=0,speed=200,hide=1,persist=1'); </script> <br /><br /></div> <script type="text/javascript"><!-- sections = ['headere', 'redirect', 'download']; animatedcollapse.addDiv('headere', 'fade=1,speed=400,persist=1,hide=0'); animatedcollapse.addDiv('redirect', 'fade=1,speed=400,persist=1,hide=1'); animatedcollapse.addDiv('download', 'fade=1,speed=400,persist=1,hide=1'); animatedcollapse.init(); --></script> </div> </div> <div id="footer"> <div id="footer-contents" class="page-contents"> <div id="copy_note"><p>Drepturi de autor © 2008-2024 punctsivirgula.ro. <a href="/?legal">Anumite drepturi rezervate.</a></p> <p class="lastMod">Ultima modificare a paginii: 9 august 2011.</p> </div> <div id="disclaimer"></div> </div> </div> <div class="hidden"> <script type="text/javascript"><!-- $( document ).ready( function() { $( '#content_left>ul' ).find( 'li' ).hover( function() { $(this).addClass( 'hover' ); }, function() { $(this).removeClass( 'hover' ); } ); $( '#content_left>div.category' ).click( function() { $(this).next().slideToggle(400, function() { scrollFollowBox.initialOffsetTop = parseInt($('#menuSeparator').offset().top) + 40; scrollFollowBox.parentTop = scrollFollowBox.initialTop + scrollFollowBox.initialOffsetTop; }); } ); $( '#content_left>ul.categoryMenu' ).each(function(){ $(this).css("height", $(this).height() + "px"); }); $( '#content a.targetb' ).click( function() { window.open($(this).attr('href')); return false; } ); $( '#content div.tryit a' ).click( function() { window.open($(this).attr('href')); return false; } ); $( '#content div.tryit a' ).attr( 'title', 'Testeaza codul-sursa online (se va deschide o fereastra noua)' ); //Restart the scroll position to ( 0, 0 ) (Firefox doesn't reset it) $('window').attr({scrollTop:0,scrollLeft:0}); // local scroll titles $('#content h2').localScroll({ duration:450, hash:true, onBefore:function( e, anchor, $target ){ if( this.getAttribute( 'rel' ) ) { animatedcollapse.show( this.getAttribute( 'rel' ) ); } if( this.blur ) this.blur();//remove the awful outline } }); // local scroll - comments $('#content div.commentsBar').localScroll({ duration:350, hash:true, onBefore:function( e, anchor, $target ){//'this' is the clicked link if( (this.getAttribute( 'rel' )) && (this.getAttribute( 'rel' ).indexOf( 'toggle' ) == -1) ) { animatedcollapse.show( 'ac_' + this.getAttribute( 'rel' ) ); animatedcollapse.show( 'sc_' + this.getAttribute( 'rel' ) ); } else { return false; } if( this.blur ) this.blur();//remove the awful outline } }); // validate/submit forms if( typeof(sections) != 'undefined' ) $.each( sections, function(index, section) { var v = $("#fc_" + section).validate({ rules: { nume: { required: true, minlength: 3 }, email: { email: true }, website: { url: true }, titlu: { required: true, minlength: 5 }, comentariu: { required: true, minlength: 5 } }, messages: { nume: "Introduceti numele", email: "Introduceti un email valid", website: "Introduceti un URL valid", titlu: "Introduceti un titlu", comentariu: "Introduceti mesajul" }, errorPlacement: function(error, element) { if ( element.is(":radio") ) error.appendTo( element.parent().next().next() ); else if ( element.is(":checkbox") ) error.appendTo( element.next() ); else error.appendTo( element.parent().next() ); }, success: function(label) { label.html(" ").addClass("success"); }, submitHandler: function(form) { jQuery(form).ajaxSubmit({ url: "/cmmnts.php", type: "post", beforeSubmit: function(formArray, jqForm) { $( '#fc_l_' + section ).show(); }, success: function(response) { if( response == '1' ) { v.resetForm(); animatedcollapse.toggle( 'ac_' + section ); $('#toggle_ac_' + section).html("Comentariul a fost trimis. Adauga un alt comentariu."); } else { alert('Itemul nu a putut fi adaugat. Va rugam incercati din nou'); } $( '#fc_l_' + section ).hide(); } }); } }); }); initFloatingBoxDone = false; var initFloatingBox = function() { if(!initFloatingBoxDone) $( '#floatingBox' ).scrollFollow({ easing: 'easeOutQuint', container: 'container', offset: 50, reference: 'menuSeparator' }) initFloatingBoxDone = true; }; var ctgToHide = $( '#content_left>ul.categoryMenu.slideUp' ); if( ctgToHide.length > 0 ) { setTimeout( function() { ctgToHide.slideUp(400, initFloatingBox); }, 500 ); } else { initFloatingBox(); } } ); --></script> </div> <!-- Matomo --> <script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//stats.punctsivirgula.ro/piwik/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <!-- End Matomo Code --> </body> </html>