Problém s hlavičkami HTTP odpovede v PHP
Podľa pravidiel HTTP sa najprv odosielajú
HTTP hlavičky a potom telo HTTP odpovede.
Kvôli tomu má práca s funkciou header
v PHP svoje špecifiká.
Problém je v tom, že ak pred volaním tejto
funkcie bude nejaký výstup na obrazovku,
bude interpretovaný ako začiatok
tela odpovede. V tomto prípade volanie
funkcie header povedie
k varovaniu PHP s textom
headers already sent.
V takom prípade sa hlavičky možno ani neodošlú.
Možno ani chyba sa nezobrazí (závisí od
nastavení PHP). Ale najčastejšie to bude len
na lokálnom serveri, a pri nasadení stránky na internet
sa všetko pokazí.
Pod výstupom na obrazovku sa rozumie akýkoľvek text. Napríklad takto:
text
<?php
header('Content-Type: text/html');
?>
Alebo prázdny riadok:
<?php
header('Content-Type: text/html');
?>
Alebo medzera:
<?php
header('Content-Type: text/html');
?>
Alebo tag:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Alebo výstup pomocou echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Alebo výstup pomocou var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Aj varovania PHP budú výstupmi na obrazovku. V nasledujúcom príklade sa zámerne pristupuje k neexistujúcej premennej, čo povedie k výstupu varovania:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Uzatvorenie PHP zátvoriek tiež spôsobuje výstup na obrazovku:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Zámerne vytvorte výstup na obrazovku
pred funkciou header.
Študujte text vzniknutej chyby.
Opravte chybu, ktorá bola urobená v tomto kóde:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>