Cannot modify header information headers already sent by php setcookie

Как исправить ошибку WordPress Cannot modify header information — headers already sent by?

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

Значение ошибки

Чтобы понять смысл фразы, её нужно перевести на русский язык. На понятном нам языке – «Нет возможности изменить заголовки – они уже были отправлены». Это определение не даёт доступного для понимания ответа, почему появился сбой. По крайней мере оно непонятно рядовому пользователю.

Чтобы разобраться в проблеме, придётся немного углубиться в принцип загрузки страницы. Изначально браузер загружает именно заголовки, в них передаётся такая информация:

  • Кодировка;
  • Информация о сервере;
  • Cookie;
  • Оригинальный язык сайта;
  • Прочая техническая информация.

Только затем браузер переходит к обработке функций и построению сайта. При повторном изменении одной из характеристик заголовка, как раз и появляется ошибка. Это означает, что мы пытается несвоевременно или неправильно внести коррективы в заголовки. Преимущественно ошибку вызывают команды PHP: header, setcookie и некоторые другие, отвечающие за работу с cookie и сессиями.

Читайте также:  Http proof budget21 ru client6 login html

Скорее всего из-за неопытности, программист внёс какую-то команду перед той, что влияет на заголовки. Таким образом страница уже сформировала заголовки к выполнению команды. При следующей попытке передачи данных в header появляется ошибка. Простой перенос функции часто решает проблему, но нужно знать, что и куда переносить.

Установка команды до заголовка

Это одна из самых частых причин ошибки, которая свойственна неопытным программистам. Она также может появиться по банальной невнимательности. На скриншоте видно, как быть не должно.

Сейчас появится ошибка. Как же правильно сделать то же самое?

Во втором примере всё будет работать правильно. Всё из-за того, что команда вызова текста стояла перед header. Именно неправильная очерёдность записи и стала проблемой формирования заголовков. Из-за того, что заголовки загружаются в первую очередь, обработка прочей информации о странице могла прекратиться.

Важно! Запомните, всегда заголовки идут перед какими-либо функциями и командами.

На практике не всё так просто. Мы можем поставить заголовок вначале документа, но все равно ошибка продолжит появляться. Почему так происходит? Всё дело в структуре WordPress. Данная CMS загружает массу файлов во время прогрузки страницы. Некоторые из них подгружаются сразу, а другие – в третью или последнюю очередь. Добавление записи с header в файл footer.php, content.php и другие приведут к ошибке. Подобные команды нужно вводить в header.php или аналогичный файл (зависит от темы).

В записи есть лишний пробел

Обнаружить данную причину сбоя сложнее и при ней также появляется ошибка «Cannot modify header information». Сложность в том, что визуальная разница может быть практически незаметной. В PHP любой символ и даже пробел имеет свои функции, лишний или недостающий пробел «ломает» весь сайт. Коварность проблемы ещё и в том, что вы могли не добавлять пробел самостоятельно. Он мог появиться из-за изменения кодировки, копирования команд или работы с неподходящим текстовым редактором.

Исправить проблему несложно, достаточно открыть документ иным текстовым редактором и удостовериться в правильности записи. Обращайте внимание на каждую строку, в том числе с открытием PHP-кода.

На скриншоте видно, что запись начинается с пробела, а не

Применение команды include

Довольно часто наблюдается неправильное использование include, особенно у администраторов сайтов без опыта в программировании. Задача команды – загрузить в текущий документ другой файл. При попытке подключения файла до отправки заголовков, появляется ошибка.

Способ решения – перенести команду на пару строк ниже, после завершения формирования header. О строке с ошибкой вам сообщит встроенный инспектор кода в браузер (смотрите на информацию в скобках рядом с сообщением).

Кстати, не только функция header должна задаваться вначале файла. Те же самые правила действуют и в отношении команд setcookie, session_start.

На представленном примере, ошибка допущена в строке файла, расположенном после записи output started. Достаточно пройти в нужный раздел и найти ошибку.

Переустановка проблемных файлов

Порой ошибка появляется после установки каких-либо плагинов, тем из магазина WordPress. Причина банальна, дополнения неправильно установились или загрузились не до конца. Ещё могла быть допущена ошибка в ядре файла.

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

Если на вашем сайте заметили ошибку «Cannot modify header information», не торопитесь искать программиста. Обычно её удаётся исправить с помощью простой корректировки: удаления пробела, перемещения функции или переустановки дополнения.

Источник

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.

    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.

    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.

    Источник

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