Can not modify header information - headers already sent

Can not modify header information - headers already sent

З цією помилкою до мене постійно звертаються і питають: "Де помилка?". Подібних листів за весь час я отримав десь штук 500, не менше. Пора з помилкою "Can not modify header information - headers already sent"Уже закінчувати. У цій статті я розповім про причини виникнення цієї помилки, а також про те, як її вирішити.

Якщо перевести цю помилку на російську мову, то вийде приблизно наступне: "Не можна змінити заголовок, оскільки вони вже відправлені". Що це за "заголовки"? Давайте розберемося.

Коли сервер повертає відповідь клієнту, крім тіла (наприклад, HTML-коду сторінки), йдуть ще й заголовки. У них міститься код відповіді сервера, cookie, кодування і безліч інших службових параметрів. Чи може PHP-скрипт відправити заголовок? Звичайно, може. Для цього існує функція header ().

Ця функція, наприклад, постійно використовується при редирект. Також дана функція регулярно використовується при генерації зображенні в PHP.

Також заголовки модифікуються при відправці cookie і при початку сесії (функція session_start ()).

А тепер про те, чому ж все-таки виникає помилка? Сервер завжди спочатку віддає сервера заголовки, а потім тіло. Якщо сервер вже повернув заголовки, потім пішло тіло, і тут він зустрічає якийсь session_start (). Виявляється горе-програміст забув відправити заголовки до початку тіла, і тепер хоче наздогнати вже пішов поїзд.

Ось код з помилкою "Can not modify header information - headers already sent":


lt ;?php
session_start
() -// А давайте почнемо сесію
?gt;



Зрозуміло, таку маячню PHP не прощає. І треба було писати так:

Відео: Warning: Can not modify header while using PHP header function

lt ;?php
session_start
() -// А давайте почнемо сесію
?gt;

Ось цей скрипт вже не викличе ніяких помилок, тому що спочатку відправляються всі заголовки, а вже потім йде генерація тіла відповіді сервера.

Відео: How to Fix Can not Modify Header Information

Інший приклад коду з помилкою:

lt ;?php
echo
"Hello!"-// Що-небудь виведемо
session_start
() -// А давайте почнемо сесію
?gt;

Те ж саме, чомусь спочатку виводиться тіло (або його шматок), а потім згадали, що ще й треба заголовки модифікувати.

Відео: XAMPP1.6.8 (PHP5.2.6) - Can not modify header information - headers already sent when using system ()




Як буде правильно переписати даний код, подумайте самі.

Ще приклад:

lt ;?php
$ error
=true-// Чи були помилки?
if($ error) echo "Виникла помилка"-
header
("Location:".$ _SERVER["HTTP_REFERER"]) -// Робимо редирект назад
exit-
?gt;

Коли у автора такого коду, нічого не виходить, він дивується від цієї помилки і каже: "Дуже дивний збіг, коли операція проходить успішно, все добре, а коли якась помилка, мені повідомляють Can not modify header information - headers already sent". Чи не дослівно, але зміст саме в цьому.

Відео: Fixing "Warning: Can not modify header information - headers already sent by .." Error

Проблема та ж сама, і правильно писати так:

lt ;?php
$ error
=true-// Чи були помилки?
if($ error) echo "Виникла помилка"-
else header("Location:".$ _SERVER["HTTP_REFERER"]) -// Робимо редирект назад
exit-
?gt;

Є і труднозаметние помилки:

lt ;?php
header
("Location:".$ _SERVER["HTTP_REFERER"]) -// Робимо редирект назад
exit-
?gt;

Помилка в даному коді виникає через пробілу, який присутній перед lt;? php. Пропуск - це звичайний символ, і він є частиною тіла відповіді. І коли сервер його бачить, він робить висновок про те, що заголовків більше не буде і пора виводити тіло.

Бувають і такі помилки, які мають все ту ж природу. Припустимо є файл a.html:

lt ;?php echo "Hello"-?gt;

Далі є інший файл з таким кодом:

lt ;?php
require_once
"A.html"-
header
("Location:".$ _SERVER["HTTP_REFERER"]) -// Робимо редирект назад
exit-
?gt;

І людина щиро дивується, звідки помилка, якщо він нічого не виводив? Тому дивитися треба не конкретно 1 файл, а всі файли, які підключаються в ньому. І в тих, що підключаються у підключаються, теж треба дивитися, щоб не було виведення.

І останній момент, але вже більш складний. Виявляється, що іноді ця помилка відбувається і при правильному коді. Тоді все справа в кодуванні. Переконайтеся, що кодування файлу "UTF-8 без BOM", Причому саме"без BOM", А не просто"UTF-8". Оскільки BOM - це байти, що йдуть в самому початку файлу, і вони є висновком.

Маю велику надію, що дана стаття допоможе вирішити абсолютно всі проблеми, пов`язані з помилкою "Can not modify header information - headers already sent", Оскільки я постарався висвітлити всі виникаючі проблеми. А далі треба включити голову, і подумати, а що у Вашому коді не так?

Поділися в соціальних мережах:

Схожі
Реалізація редиректу на phpРеалізація редиректу на php
Як дізнатися http-заголовки сервера через curlЯк дізнатися http-заголовки сервера через curl
Function fetch_assoc () on a non-objectFunction fetch_assoc () on a non-object
Flash drive information extractor розповість все про вашу флешціFlash drive information extractor розповість все про вашу флешці
Як дізнатися реальний ip-адреса відвідувачаЯк дізнатися реальний ip-адреса відвідувача
Bad pool header в windows 7 і windows 8Bad pool header в windows 7 і windows 8
Як відключити кешування на phpЯк відключити кешування на php
Як відправити referer через curlЯк відправити referer через curl
Скорочення url-адреси на phpСкорочення url-адреси на php
Коли використовувати reset.css і normalize.css.Коли використовувати reset.css і normalize.css.
» » Can not modify header information - headers already sent