HTTP-vastauksen otsikko-ongelma PHP:ssä

HTTP-sääntöjen mukaan lähetetään ensin HTTP-otsikot ja sitten HTTP-vastauksen runko. Tästä johtuen header-funktion käyttö PHP:ssä on erikoista.

Asia on siinä, että jos ennen tämän funktion kutsua tulostetaan jotain näytölle, se tulkitaan vastauksen rungon alkuksi. Tässä tapauksessa header-funktion kutsu johtaa PHP-varoituksen tekstillä headers already sent. Otsikot saattavat jopa lähettyä. Virhe ei ehkä edes tulostu (riippuen PHP:n asetuksista). Mutta useimmiten tämä tapahtuu vain paikallisessa ympäristössä, ja kun sivusto lasketaan internetiin, kaikki hajoaa.

Tulostuksella näytölle tarkoitetaan mitä tahansa tekstiä. Esimerkiksi näin:

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

Tai tyhjä rivi:

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

Tai välilyönti:

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

Tai tagi:

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

Tai tulostus echo:lla:

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

Tai tulostus var_dump:lla:

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

Jopa PHP-varoitukset ovat tulostusta näytölle. Seuraavassa esimerkissä tarkoituksella viitataan olematon muuttujaan, mikä johtaa varoituksen tulostukseen:

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

PHP-sulkujen väliset rivinvaihdot myös aiheuttavat tulostusta näytölle:

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

Luo tarkoituksella tulostus näytölle ennen header-funktiota. Tutki syntyvän virheen tekstiä.

Задание 2

Korjaa tässä koodissa tehty virhe:

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