Πρόβλημα με τις επικεφαλίδες HTTP απόκρισης στην PHP
Σύμφωνα με τους κανόνες του HTTP, πρώτα στέλνονται
οι επικεφαλίδες HTTP και μετά το σώμα της HTTP απόκρισης.
Λόγω αυτού, η εργασία με τη συνάρτηση header
στη PHP έχει τις ιδιαιτερότητές της.
Το θέμα είναι ότι αν πριν από την κλήση αυτής
της συνάρτησης υπάρξει κάποια έξοδος στην οθόνη,
αυτή θα ερμηνευτεί ως η αρχή
του σώματος της απόκρισης. Σε αυτήν την περίπτωση, η κλήση
της συνάρτησης header θα οδηγήσει
σε μια προειδοποίηση της PHP με κείμενο
headers already sent.
Σε αυτήν την περίπτωση, οι επικεφαλίδες μπορεί ακόμη και να σταλούν.
Μπορεί ακόμη και το σφάλμα να μην εμφανιστεί (εξαρτάται από τις
ρυθμίσεις της PHP). Αλλά τις περισσότερες φορές αυτό συμβαίνει μόνο
στοπ τοπικό περιβάλλον, ενώ όταν το site ανέβει στο διαδίκτυο
όλα θα σπάσουν.
Ως έξοδος στην οθόνη νοείται οποιοδήποτε κείμενο. Για παράδειγμα, έτσι:
κείμενο
<?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>
κείμενο
<body>
<html>