PHPFAQ  
Начинающим   Технологии   MySQL   Ошибки   Ссылки   Юмор   О сайте   Форум   PHP Club  

Решение проблемы "Cannot add header information - headers already sent"


Ошибку эту исправить несложно.
Часто такое же сообщение появляется при старте сессий, в немного другой формулировке:
Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent

Для начала узнаем, как вообще общается броузер с сервером. Происходит это по специальному протоколу HTTP. К примеру, когда ты набраешь адрес, или нажимаешь на ссылку, броузер посылает HTTP запрос серверу. Сервер отвечает. Первыми в ответе ВСЕГДА идут HTTP заголовки. Хоть один. И только потом уже сервер посылает, а броузер принимает, текст, или картинку, или файл - в общем, что было запрошено. Cобственно, из-за этого правила - сначала заголовок, а потом информация, и происходит данная ошибка. РНР, для твоего удобства, посылает заголовки автоматически, как только скрипт начинает выдавать бровзеру информацию. Соответственно, если хоть один пробел был уже передан пользователю, заголовки уже ушли, и снова их послать уже никак не можно. А, как ты уже, наверное, догадался, команды header(), setcookie, session_start(), посылают HTTP заголовки.

Разберем теперь это предупреждение.
Warning: Cannot add header information - headers already sent by (output started at /www/script.php:5) on line 20

Cannot add header information - headers already sent. Все ясно написано. "Не могу послать заголовок, поезд уже ушел" - пишет нам РНР. Дальше РНР сообщает, в каком скрипте и в какой его строке (output started at /www/script.php:5) произошел вывод информации, вызвавший автоматическую посылку заголовков. Очень легко найти и исправить. Может быть, там html теги, может быть, echo, а может и просто незамеченая пустая строка или пробел перед первым тегом <?.
Очень часто такую ошибку вызывает файл, подключаемый через include, в котором либо есть какой-то вывод, либо пустая строка после закрывающего PHP тега - обнаружить ее очень трудно.

Для решения этой проблемы нужно функцию header() (или session_start(), setcookie) и всю логику, которая ее вызывает, поместить ДО любого вывода в броузер. Просто перенести повыше в скрипте.
Ведь вы всё равно перенаправляете браузер. То есть, никакой текст всё равно не будет выведен! Значит, и выводить что-то одновременно с заголовком Location нет смысла. Правильно планируйте структуру своего скрипта: блок, который обрабатывает POST, не должен ничего выводить в браузер.

Иногда вы проверили ВСЁ - нигде ничего нет. Смените редактор. Посмотрите свой файл в другой программе. К примеру, Windows Блокнот при использовании кодировки Unicode добавляет в начало вашего файла служебный символ Byte Order Mark, никак при этом не ставя вас в известность. Откройте скрипт в другом редакторе и удалите посторонние символы. И смените Блокнот на другой редактор.
Или сохраняйте в кодировке UTF-8 without BOM

Многочисленные вопросы на форуме заставляют меня сделать здесь важное замечание:
Эта ошибка появляется не от того, что у вас в скрипте "что то написано выше". А от того, что РНР выводит что-то в браузер. Это не обязательно код. Это может быть сообщение об ошибке. может быть пробел или хтмл тег. Да-да. Для самых талантливых: речь идет о любом символе, отправленном в браузер, а не только о тех, которые браузер отображает неискушенному пользователю. У HTML страниц есть исходный текст. И именно он является результатом работы PHP скрипта, а не красивые буковки с картиночками, как думает очень большое количество людей.

Другие материалы раздела:
Хочу изучать PHP и Mysql. С чего начать?
Самые основы. Как работает PHP.
Документация по PHP. Мануал по PHP, книги.
Не передаются переменные! Проблема Undefined variable
Различие между абсолютными и относительными путями. В файловой системе и на сайте.
Пример системы управления сайтом
Что такое PHP?
Как писать музыку на PHP


Комментарии

Уася 27.01.12 09:21
Спасибо, полезная инфа.
Александр 20.12.11 18:09
Спасибо, все не мог понять в чем проблема.А всего лишь стоял пробел перед <?php :)
Вячеслав 05.12.11 19:39
Лично мне помогло при этой проблеме не смена кодировки а удаление функции session_start() в моем скрипте и перемещение ее в самое начало. Тоесть мой скрипт начинался так
<?php session_start() ?>
...
Павел 07.11.11 19:44
Спасибо, я всю неделю маялся с проблемой, знал все что тут написано, но про UTF-8 with BOM не знал. Никогда бы не догадался,еще раз спасибо огромное!
Николай 29.10.11 00:45
Спасибо автору!!!
UTF-8 with BOM - было моей проблемой - в жизни бы не догадался!
Ani 01.10.11 11:37
Statya ochen xoroshaya,no u menya esho problema est,esli pomojete reshit budu blogodarna...ya kak vi i posovetovali pomenyala kodirovku na utf8 without Bom no s etim vse shtifti pomenyalis i na sayte teper nekokogo ponyatnogo slovo..
Роман 01.10.11 00:24
Спасибо , хорошая статья. Хороший ресурс, надеюсь здесь еще не раз пороботить ), а там глядишь и сам чем-нибудь поделюсь.
Даня 05.09.11 16:16
Молодец Марат , твой файл теперь не сможет получать/создовать сессии.
Hayk 11.08.11 13:54
Mne ochen pomaglo etoooooooooo <<Или сохраняйте в кодировке UTF-8 without BOM >>
ogromnoe spasibo
Lu 01.08.11 15:00
Спасибо.

Написать комментарий
Пожалуйста, воздержитесь от посылки спама.
Сообщения, содержащие гиперссылки, проходят премодерацию.
Представьтесь:
Вы робот?
Сообщение:

© phpfaq.ru, 2012
Rambler's Top100 0.017 sec.