Problem sa HTTP zaglavljima odgovora u PHP-u

Prema HTTP pravilima, prvo se šalju HTTP zaglavlja, a zatim telo HTTP odgovora. Zbog toga rad sa funkcijom header u PHP-u ima svoje specifičnosti.

Stvar je u tome da će, ako pre poziva ove funkcije bude bilo kakav ispis na ekran, on biti tretiran kao početak tela odgovora. U tom slučaju poziv funkcije header će dovesti do upozorenja PHP-a sa tekstom headers already sent. Pritom, zaglavlja možda čak i budu poslata. Možda čak i greška neće biti prikazana (zavisi od PHP podešavanja). Ali najčešće će ovo biti samo na lokalnoj mašini, a kada se sajt postavi na internet sve će se pokvariti.

Pod ispisom na ekran podrazumeva se bilo koji tekst. Na primer, ovako:

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

Ili prazan red:

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

Ili razmak:

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

Ili tag:

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

Ili ispis putem echo:

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

Ili ispis putem var_dump:

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

Čak će i upozorenja PHP-a biti ispisi na ekran. U sledećem primeru namerno se pristupa nepostojećoj promenljivoj, što će dovesti do ispisa upozorenja:

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

Prekidi PHP zagrada takođe generišu ispis na ekran:

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

Namerno napravite ispis na ekran pre funkcije header. Proučite tekst greške koja se pojavi.

Задание 2

Ispravite grešku napravljenu u ovom kodu:

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