HTTP atsakymo antraščių problema PHP
Pagal HTTP taisykles pirmiausia siunčiamos
HTTP antraštės, o po to HTTP atsakymo korpusas.
Dėl to darbas su funkcija header
PHP turi savo ypatumų.
Faktas yra tas, kad jei prieš iškvietus šią
funkciją bus kokia nors išvestis į ekraną,
ji bus traktuojama kaip atsakymo
korpuso pradžia. Tokiu atveju šios
funkcijos header iškvietimas privers
PHP įspėjimą su tekstu
headers already sent.
Tuomet antraštės gali net būti išsiųstos.
Gali net ir klaida neišsijungti (priklauso nuo
PHP nustatymų). Tačiau dažniausiai tai bus tik
vietiniame serveryje, o įkėlus svetainę į internetą
viskas sulūš.
Išvestimi į ekraną suprantamas bet koks tekstas. Pavyzdžiui, taip:
tekstas
<?php
header('Content-Type: text/html');
?>
Arba tuščia eilutė:
<?php
header('Content-Type: text/html');
?>
Arba tarpas:
<?php
header('Content-Type: text/html');
?>
Arba tagas:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
Arba išvestis per echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
Arba išvestis per var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Net PHP įspėjimai bus išvestimi į ekraną. Šiame pavyzdyje tyčia kreipiamasi į neegzistuojančią kintamąjį, kas sukels įspėjimo išvedimą:
<?php
$text += 1;
header('Content-Type: text/html');
?>
PHP skliaustų pertraukos taip pat sukuria išvestį į ekraną:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Sąmoningai sukurkite išvestį į ekraną
prieš funkciją header.
Išnagrinėkite atsirandančios klaidos tekstą.
Ištaisykite klaidą, padarytą šiame kode:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
tekstas
<body>
<html>