Решение проблемы "Cannot add header information - headers already sent"Ошибку эту исправить несложно. Часто такое же сообщение появляется при старте сессий, в немного другой формулировке: Warning: Cannot send session cookie - headers already sentWarning: 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 20Cannot 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 |
| Андрій | 12.05.12 08:52 |
| Большое спасибо, убрал пустую строку перед первым <? в includ и все заработало!!!! | |
| Юлия | 08.05.12 00:41 |
| В строке в которой выдает эту ошибку находиться session_start (); и больше ничего - все остальные теги закрыты |
|
| Юрий | 30.04.12 23:49 |
| спасибо, как бы помогло, но осталась проблема. без BOM вместо русского текста другие символы. как с этим бороться ? | |
| Constantin | 27.04.12 16:29 |
| Большое спасибо автору. Вот что значит суть в мелочах. Полдня потерял перелопачивая форум Wordpress. А решение то в кодировке. | |
| Anonymous | 16.04.12 17:03 |
| Dio, ты же сам перед <? поставил <html><body>, а еще гадаешь. | |
| Мария | 04.04.12 21:53 |
| Спасибо! Очень полезная статья! | |
| Иван | 02.04.12 15:22 |
| СПАСИБО!!!! Весь мозг себе съел.. переделал сайт на UTF8 - все тоже самое, только не работает. 3 дня потратил. еще раз, Огромное спасибо автору!!!!!! | |
| Александр | 17.03.12 00:02 |
| Спасибо большое. Всю голову изломал откуда эта ошибка появляется, а оказывается конфиг у CMS был сохранен с BOM. | |
| Денис | 08.03.12 00:51 |
| Dio, перед <? Хтмл теги и какие-либо символы стоять не должны Вот и выводит ошибку |
|
| Dio | 06.03.12 10:18 |
| *вместо imagegif('$m') стоит imagegif('1.gif') | |