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", Оскільки я постарався висвітлити всі виникаючі проблеми. А далі треба включити голову, і подумати, а що у Вашому коді не так?
Bad pool header в windows 7 і windows 8
Коди помилки http веб-сервера. Розшифровка кодів
Сокети: сервер на php
Як дізнатися http-заголовки сервера через curl
Nodejs. Як створити сервер.
Як зробити парсер контенту на php
Як користуватися curl
Як дізнатися реальний ip-адреса відвідувача
Як відключити кешування на php
Коли використовувати reset.css і normalize.css.
Як відправити referer через curl
Відправлення файлу по e-mail на php
Скорочення url-адреси на php
Обробка помилок в php
Малювання тексту в php
Реалізація редиректу на php
Відправка e-mail в php
Робота з cookie в php
Flash drive information extractor розповість все про вашу флешці
Проблеми з кодуванням при малюванні тексту в php
Створення зображень в php
Реалізація редиректу на php
Як дізнатися http-заголовки сервера через curl
Function fetch_assoc () on a non-object
Flash drive information extractor розповість все про вашу флешці
Як дізнатися реальний ip-адреса відвідувача
Bad pool header в windows 7 і windows 8
Як відключити кешування на php
Як відправити referer через curl
Скорочення url-адреси на php
Коли використовувати reset.css і normalize.css.