Решение проблемы "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 |
| Уася | 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 |
| Спасибо. | |