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, никак при этом не ставя вас в известность. Откройте скрипт в другом редакторе и удалите посторонние символы. И смените Блокнот на другой редактор.

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

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


Комментарии

sky 07.09.10 14:48
Спасибо за статью) Криворукие заказчики сами полезли в файлы, и "забыли" пробел после ?>
С помощью статьи отыскал, удалил, все ок)
Лев 06.09.10 16:21
Спасибо за статью, очень хорошо написано, без лишнего. Да еще и просто и доходчиво))
Олег 16.08.10 03:17
очень познавательно! спасибо!
иван 15.08.10 22:50
спасибо коонечно
Владимр 13.08.10 03:11
Перевел файл в NotePad++ в кодировку utf8, после чего появилась эта ошибка,найти лишний символ никак не могу но он явно выскакивает если смотреть откомпилированный код.. что делать?
Air 09.08.10 22:04
Автор молодца!!!
Все проблемы из-за "служебного символа Byte Order Mark", Через HexEdit+ я его увидел, удалил и всё вновь заработало, спс :)
NICKNAME 05.08.10 20:16
Stop hack the program!!!
Dmitriy 16.07.10 17:34
Спасибо большое за статью!
В Notepad++ нужно выбрать Кодировки ->UTF-8(без BOM)
Ower 08.07.10 23:11
Спасибо!
Дмитрий 18.06.10 04:20
Спасибо, очень помог совет оказывается был пробел перед <? и после, удалил- Все заработало

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

© phpfaq.ru, 2010
Rambler's Top100 0.015 sec.