Problém s hlavičkami HTTP odpovědi v PHP
Podle pravidel HTTP se nejprve odesílají
HTTP hlavičky a poté tělo HTTP odpovědi.
Kvůli tomu má práce s funkcí header
v PHP svá specifika.
Problém je v tom, že pokud před voláním této
funkce bude nějaký výstup na obrazovku,
bude interpretován jako začátek
těla odpovědi. V tomto případě volání
funkce header povede
k varování PHP s textem
headers already sent.
Přitom se hlavičky mohou i odeslat.
Může se dokonce nestat ani chyba (záleží na
nastavení PHP). Ale většinou to bude pouze
na lokálním prostředí, a při nasazení webu na internet
se vše rozbije.
Pod výstupem na obrazovku se rozumí jakýkoli text. Například takto:
text
<?php
header('Content-Type: text/html');
?>
Nebo prázdný řádek:
<?php
header('Content-Type: text/html');
?>
Nebo mezera:
<?php
header('Content-Type: text/html');
?>
Nebo tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Nebo výstup pomocí echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Nebo výstup pomocí var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
I varování PHP budou výstupy na obrazovku. V následujícím příkladu je záměrně přistoupeno k neexistující proměnné, což povede k výpisu varování:
<?php
$text += 1;
header('Content-Type: text/html');
?>
I přerušení PHP závorek také generuje výstup na obrazovku:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Záměrně vytvořte výstup na obrazovku
před funkcí header.
Prostudujte text vzniklé chyby.
Opravte chybu, která byla provedena v tomto kódu:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>