Cannot modify header information headers already sent by php cookie

Cannot modify header information – headers already sent.

This is probably one of the most common PHP errors that you will come across as you struggle to come to grips with the intricate world of web development:

Cannot modify header information – headers already sent in (file location).

To sum this error up – It is basically telling you that you cannot output data before you attempt to modify header information. A quick example:

The code above will cause the error in question, simply because we attempted to change our header information after we had already printed out the string “Example” to the browser.

Common causes of this particular error are as follows:

  1. Attempting to modify header information after output has already been sent to the client (as seen in the code example above).
  2. Random whitespace and newline characters above the opening PHP tag.
  3. Whitespace after closing PHP tags in files that have been included at the top of the script.
  4. PHP errors causing error messages to be printed out onto the screen before the headers are modified.
  5. Attempting to modify header information after HTML has already been displayed.
Читайте также:  Datetime php прибавить час

An example of whitespace causing the “headers already sent” error:

Here, we can see that there is a blank line before our opening PHP tag. This blank line is interpreted as output by the server, resulting in the “headers already sent” error.

An example of HTML causing issues:

Our HTML is interpreted as being output, which prevents us from carrying out the intended redirect.

Debugging.

To debug this issue, you need to learn how to understand the warning message that PHP displays. Lets take the following example:

Warning: Cannot modify header information – headers already sent by (output started at /www/my-page.php:12) in /www/my-page.php on line 67

Here, we can see that PHP is telling us what the problem is being caused by LINE 12 in my-page.php. It is also telling us that our attempt to modify the header information failed on LINE 67 on my-page.php

Basically, the output on LINE 12 prevented our attempt to modify the header information on LINE 67.

Modifying Header Info.

There are a number of PHP functions that allow us to modify the HTTP header that the client receives. Popular examples include the functions header, session_start and setcookie. When using these functions, you MUST make sure that no output has been sent to the client beforehand.

Источник

Cannot modify header information — headers already sent

Cannot modify header information - headers already sent

С этой ошибкой ко мне постоянно обращаются и спрашивают: «Где ошибка?«. Подобных писем за всё время я получил где-то штук 500, не меньше. Пора с ошибкой «Cannot modify header information — headers already sent» уже заканчивать. В этой статье я расскажу о причинах возникновения данной ошибки, а также о том, как её решить.

Если перевести данную ошибку на русский язык, то получится примерно следующее: «Нельзя изменить заголовок, поскольку они уже отправлены«. Что это за «заголовки«? Давайте разберёмся.

Когда сервер возвращает ответ клиенту, помимо тела (например, HTML-кода страницы), идут ещё и заголовки. В них содержится код ответа сервера, cookie, кодировка и множество других служебных параметров. Может ли PHP-скрипт отправить заголовок? Конечно, может. Для этого существует функция header().

Данная функция, например, постоянно используется при редиректе. Также данная функция регулярно используется при генерации изображении в PHP.

Также заголовки модифицируются при отправке cookie и при начале сессии (функция session_start()).

А теперь о том, почему же всё-таки возникает ошибка? Сервер всегда сначала отдаёт серверу заголовки, а потом тело. Если сервер уже вернул заголовки, потом пошло тело, и тут он встречает какой-нибудь session_start(). Оказывается горе-программист забыл отправить заголовки до начала тела, и теперь хочет догнать уже ушедший поезд.

Вот код с ошибкой «Cannot modify header information — headers already sent«:

session_start(); // А давайте начнём сессию
?>

Разумеется, такой бред PHP не прощает. И надо было писать так:

Вот этот скрипт уже не вызовет никаких ошибок, потому что сначала отправляются все заголовки, а уже потом идёт генерация тела ответа сервера.

Другой пример кода с ошибкой:

echo «Hello!»; // Что-нибудь выведем
session_start(); // А давайте начнём сессию
?>

То же самое, почему-то сначала выводится тело (либо его кусок), а потом вспомнили, что ещё и надо заголовки модифицировать.

Как будет правильно переписать данный код, подумайте сами.

$error = true; // Были ли ошибки?
if ($error) echo «Произошла ошибка»;
header(«Location: «.$_SERVER[«HTTP_REFERER»]); // Делаем редирект обратно
exit;
?>

Когда у автора такого кода, ничего не получается, он удивляется от этой ошибки и говорит: «Очень странное совпадение, когда операция проходит успешно, всё хорошо, а когда какая-то ошибка, мне сообщают Cannot modify header information — headers already sent». Не дословно, но смысл именно в этом.

Проблема та же самая, и правильно писать так:

$error = true; // Были ли ошибки?
if ($error) echo «Произошла ошибка»;
else header(«Location: «.$_SERVER[«HTTP_REFERER»]); // Делаем редирект обратно
exit;
?>

Есть и труднозаметные ошибки:

header(«Location: «.$_SERVER[«HTTP_REFERER»]); // Делаем редирект обратно
exit;
?>

Бывают и следующие ошибки, имеющие всё ту же природу. Допустим есть файл a.html:

Далее есть другой файл с таким кодом:

require_once «a.html»;
header(«Location: «.$_SERVER[«HTTP_REFERER»]); // Делаем редирект обратно
exit;
?>

И человек искренне удивляется, откуда ошибка, если он ничего не выводил? Поэтому смотреть надо не конкретно 1 файл, а все файлы, которые подключаются в нём. И в тех, что подключаются у подключаемых, тоже надо смотреть, чтобы не было вывода.

И последний момент, но уже более сложный. Оказывается, что иногда эта ошибка происходит и при правильном коде. Тогда всё дело в кодировке. Убедитесь, что кодировка файла «UTF-8 без BOM«, причём именно «без BOM«, а не просто «UTF-8«. Поскольку BOM — это байты, идущие в самом начале файла, и они являются выводом.

Очень надеюсь, что данная статья поможет решить абсолютно все проблемы, связанные с ошибкой «Cannot modify header information — headers already sent«, поскольку я постарался осветить все возникающие проблемы. А дальше надо включить голову, и подумать, а что в Вашем коде не так?

Создано 24.12.2012 06:35:29

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 10 ):

    А я например использую ob_start() как и Михаил

    Интересная статья. спасибо.

    Источник

    Решение ошибки Cannot modify header information — headers already sent by в WordPress

    Сегодня каждый пользователь может сделать свой сайт на любом движке, в т.ч. бесплатном – Joomla, WordPress и других. Освоить азы программирования по имеющейся в сети информации тоже не составит труда. Но иногда даже малейшая ошибка в коде, допущенная при разработке сайта, может привести к его неработоспособности. И сегодня мы рассмотрим проблему Cannot modify header information — headers already sent by. И как исправить её самостоятельно, чтобы все работало без сбоев, а также разберём почему она появляется.

    Картинка Cannot modify

    Что означает выражение Cannot modify?

    На русский язык полный текст сообщения переводится как “Нет возможности изменить заголовки – они уже были отправлены” . У этого сообщения могут еще быть такие варианты.

    Как еще может выглядеть сообщение о возникшей проблеме

    Почему выходит такая ошибка? Чтобы понять это, необходимо узнать, как браузер отвечает на запросы пользователя. Когда мы открываем страницу, нам в первую очередь присылаются заголовки, в которых содержится следующая информация:

    • данные о сервере;
    • кодировка;
    • куки;
    • язык сайта;
    • сессия;
    • другая служебная информация.

    Ошибку Cannot modify header information — headers already sent by вызывают такие PHP-команды, как setcookie, header и другие, влияющие на работу сессий или куки.

    Почему выходит ошибка и как её исправить в Вордпресс?

    Как мы рассмотрели выше, в первую очередь перед загрузкой страницы нам посылаются заголовки с важной информацией, а потом уже приходят запрошенные данные. По неопытности или невнимательности программисты допускают ошибку в исходном коде. Они пытаются вначале определить другие функции (чаще всего, используя, при этом команду echo), а после этого уже занимаются установкой куки или отправкой заголовков. Чаще всего из-за этого и выскакивает ошибка на WordPress.

    Рассмотрим на примерах, как выглядит рассматриваемая нами проблема.

    Размещение информации перед заголовками

    Сначала изучим один тип ошибки, когда программист действует по неопытности либо невнимательности. Здесь показан некорректный вариант.

    Код php

    А сейчас – верное написание кода.

    Код html

    Посмотрим внимательно на картинки и найдем место, куда закралась ошибка. Как видно в неправильном варианте, перед заголовком header идет строка echo. Вот это и есть причина проблемы – никакую информацию нельзя выводить раньше заголовков. Сначала идут данные строки header и только потом – все остальное.

    Появление лишнего пробела

    Причиной появления ошибки Cannot modify header information может быть и лишний пробел, который незаметен при первом взгляде. Если он присутствует в коде, то, естественно, и будет загружаться раньше, чем заголовки. В результате пользователь увидит на экране сообщение об ошибке. Пустой пробел может появиться самостоятельно, если документ открывался в стандартном блокноте Windows. Этот редактор может, не уведомляя нас, добавить служебный символ Byte Order Mark, который выставляет лишний пробел перед заголовком. Чтобы проверить, в этом ли дело, документ необходимо открыть в любом другом редакторе и проверить. Возможно, в файле будет такая ситуация, как на картинке ниже.

    Неверный код html

    Использование команды include

    Многие программисты допускают ошибку при использовании команды include. Она применяется для объединения всех файлов и создания одного итогового. И, если попытаться вначале подключить шапку сайта (меню, слайдер и т. п.). А после этого оформить заголовки, то, естественно, появится сообщение об ошибке Cannot modify…

    Пример ошибки в коде php

    Чтобы решить проблему, необходимо функцию header (setcookie либо session_start) в скрипте разместить первой.

    Обычно в сообщении об ошибке содержится информация о том, где её искать.

    Указано место, где находится проблемный файл

    После output started — путь к файлу с ошибкой

    После слов output started следуют сведения о том, в какой строке скрипта появилась ошибка. Необходимо пройти по этому пути и, увидев проблему, решить её – убрать лишний пробел либо поставить функцию header в самом начале.

    Замена неисправных файлов

    Если ошибка закралась в установленные на WordPress плагины либо темы, то их можно переустановить. Но проблема может быть также в файлах ядра. В этом случае необходимо взять файл из чистой версии движка и инсталлировать его на место проблемного. Остальные (корректные) настройки сайта на WordPress останутся нетронутыми.

    Заключение

    Мы узнали, что означает сообщение об ошибке с текстом Cannot modify header information — headers already sent by. А также определили пути поиска проблемы и способы её решения – удаление лишнего пробела, установка функции header в самом верху скрипта или замена неисправных файлов.

    Источник

    Оцените статью