Problem z nagłówkami odpowiedzi HTTP w PHP
Zgodnie z zasadami HTTP najpierw wysyłane są
nagłówki HTTP, a potem ciało odpowiedzi HTTP.
Z tego powodu praca z funkcją header
w PHP ma swoje specyficzne cechy.
Chodzi o to, że jeśli przed wywołaniem tej
funkcji nastąpi jakieś wyjście na ekran,
będzie ono traktowane jako początek
ciała odpowiedzi. W tym przypadku wywołanie
funkcji header doprowadzi
do ostrzeżenia PHP z tekstem
headers already sent.
W tym przypadku nagłówki mogą nawet zostać wysłane.
Może nawet błąd nie zostanie wyświetlony (zależy to od
ustawień PHP). Ale najczęściej będzie to tylko
na lokalnym serwerze, a po opublikowaniu strony w internecie
wszystko się zepsuje.
Przez wyjście na ekran rozumie się dowolny tekst. Na przykład tak:
text
<?php
header('Content-Type: text/html');
?>
Lub pusty wiersz:
<?php
header('Content-Type: text/html');
?>
Lub spacja:
<?php
header('Content-Type: text/html');
?>
Lub tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Lub wyjście przez echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Lub wyjście przez var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Nawet ostrzeżenia PHP będą wyjściami na ekran. W następnym przykładzie celowo następuje odwołanie do nieistniejącej zmiennej, co doprowadzi do wyjścia ostrzeżenia:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Przerwania nawiasów PHP również generują wyjście na ekran:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Celowo stwórz wyjście na ekran
przed funkcją header.
Przeanalizuj tekst powstałego błędu.
Popraw błąd popełniony w tym kodzie:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>