Problema cu antetele HTTP de răspuns în PHP
Conform regulilor HTTP, mai întâi se trimit
antetele HTTP, iar apoi corpul răspunsului HTTP.
Din această cauză, lucrul cu funcția header
în PHP are particularități specifice.
Problema este că, dacă înainte de apelarea acestei
funcții există vreo ieșire pe ecran,
aceasta va fi interpretată ca începutul
corpului răspunsului. În acest caz, apelul
funcției header va duce
la o avertizare PHP cu textul
headers already sent.
În acest caz, antetele s-ar putea totuși să fie trimise.
Se poate chiar ca eroarea să nu fie afișată (depinde de
setările PHP). Dar cel mai adesea acest lucru se va întâmpla doar
pe mediul local, iar la publicarea site-ului pe internet
totul se va strica.
Prin ieșire pe ecran se înțelege orice text. De exemplu, așa:
text
<?php
header('Content-Type: text/html');
?>
Sau un rând gol:
<?php
header('Content-Type: text/html');
?>
Sau un spațiu:
<?php
header('Content-Type: text/html');
?>
Sau un tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Sau ieșire prin echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Sau ieșire prin var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Chiar și avertismentele PHP vor fi ieșiri pe ecran. În următorul exemplu se accesează intenționat o variabilă inexistentă, ceea ce va duce la afișarea unui avertisment:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Închiderile și deschiderile tag-urilor PHP generează de asemenea ieșire pe ecran:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Creați intenționat o ieșire pe ecran
înaintea funcției header.
Studiați textul erorii care apare.
Corectați eroarea făcută în acest cod:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>