Проблем с заглавките на HTTP отговори в PHP
По правилата на HTTP първо се изпращат
HTTP заглавки, а след това тялото на HTTP отговора.
Поради това работата с функцията header
в PHP има своите особености.
Работата е там, че ако преди извикването на тази
функция има някакъв изход на екрана,
той ще се тълкува като начало
на тялото на отговора. В този случай извикването
на функцията header ще доведе
до предупреждение в PHP с текст
headers already sent.
В този случай заглавките може дори да бъдат изпратени.
Може дори и грешката да не се изведе (зависи от
настройките на PHP). Но най-често това ще се случва само
на локалната машина, а при качване на сайта в интернет
всичко ще се счупи.
Под изход на екрана се разбира какъвто и да е текст. Например, така:
text
<?php
header('Content-Type: text/html');
?>
Или празен ред:
<?php
header('Content-Type: text/html');
?>
Или интервал:
<?php
header('Content-Type: text/html');
?>
Или таг:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Или изход чрез echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Или изход чрез var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Дори предупрежденията от PHP ще бъдат изходи на екрана. В следващия пример нарочно се осъществява достъп до несъществуваща променлива, което ще доведе до извеждане на предупреждение:
<?php
$text += 1;
header('Content-Type: text/html');
?>
Празните редове между PHP скобите също генерират изход на екрана:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Създайте нарочно изход на екрана
преди функцията header.
Проучете текста на възникващата грешка.
Поправете грешката, допусната в този код:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>