Проблем са заглављима HTTP одговора у PHP

По правилима HTTP прво се шаљу HTTP заглавља, а затим тело HTTP одговора. Због тога рад са функцијом header у PHP има своје специфичности.

Ствар је у томе што ако пре позива ове функције буде било каква пријава на екран, она ће бити тумачена као почетак тела одговора. У том случају позив функције header довешће до упозорења у PHP-у са текстом headers already sent. При том заглавља се можда ни неће послати. Можда се ни грешка неће приказати (зависи од подешавања PHP-a). Али најчешће ће то бити само на локалној машини, а при објављивању сајта на интернету све ће се покварити.

Под приказом на екран подразумева се било који текст. На пример, овако:

phpтекст
<?php
  header('Content-Type: text/html');
?>

Или празан ред:

php     
<?php
  header('Content-Type: text/html');
?>

Или размак:

php <?php
  header('Content-Type: text/html');
?>

Или таг:

html<div>
  <?php
    header('Content-Type: text/html');
  ?>
</div>

Или приказ преко echo:

php<?php
  echo 'abc';
  header('Content-Type: text/html');
?>

Или приказ преко var_dump:

php<?php
  $str = 'abc';
  var_dump($str);
  
  header('Content-Type: text/html');
?>

Чак ће и упозорења PHP-а бити прикази на екран. У следећем примеру намјерно се приступа непостојећој промјењивој, што ће довести до приказа упозорења:

php<?php
  $text += 1;
  header('Content-Type: text/html');
?>

Раздвајање PHP заграда такође генерише приказ на екран:

php<?php
  echo 'abc';
?>
<?php
  header('Content-Type: text/html');
?>
Задание 1

Намјерно направите приказ на екран пре функције header. Проучите текст настале грешке.

Задание 2

Исправите грешку допуњену у овом коду:

html<!DOCTYPE html>
<html>
  <head>
    <?php
      header('Content-Type: text/html');
    ?>
  </head>
  <body>
    текст
  <body>
<html>