Как исправить ошибку «Заголовки уже отправлены» в PHP

При запуске моего скрипта я получаю несколько таких ошибок:

Предупреждение: невозможно изменить информацию заголовка – уже отправленные заголовки ( вывод запущен в /some/file.php:12 ) в /some/file.php в строке 23

Линии, упомянутые в сообщениях об ошибках, содержат вызовы header() и setcookie() .

Что может быть причиной этого? И как это исправить?

Solutions Collecting From Web of "Как исправить ошибку «Заголовки уже отправлены» в PHP"

Это сообщение об ошибке запускается, когда что-либо отправляется перед отправкой заголовков HTTP (с помощью setcookie или header ). Общие причины вывода чего-либо перед заголовками HTTP:

  • Случайные пробелы, часто в начале или в конце файлов, например:

      <?php // Note the space before "<?php" ?> 

Чтобы этого избежать, просто оставьте закрытие ?> – это не обязательно.

  • Значения байтов в начале файла php. Изучите ваши php-файлы с помощью шестнадцатеричного редактора, чтобы узнать, так ли это. Они должны начинаться с байтов 3F 3C . Вы можете безопасно удалить BOM EF BB BF с начала файлов.
  • Явный вывод, например вызовы для echo , printf , readfile , readfile , код до <? и т.п.
  • Предупреждение, выданное php, если установлено свойство display_errors php.ini. Вместо того, чтобы сбой при ошибке программиста, php молча фиксирует ошибку и выдает предупреждение. Хотя вы можете изменить конфигурации display_errors или error_reporting , вам лучше исправить проблему.
    Общими причинами являются доступ к неопределенным элементам массива (например, $_POST['input'] без использования empty или isset для проверки того, установлен ли вход) или с помощью неопределенной константы вместо строкового литерала (как в $_POST[input] , обратите внимание на недостающие кавычки).

Включение буферизации вывода должно устранить проблему; весь вывод после вызова ob_start буферизуется в памяти до тех пор, пока вы не освободите буфер, например, с ob_end_flush .

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

Я получил эту ошибку много раз раньше. И я уверен, что все программисты PHP по крайней мере однажды получили эту ошибку. Чтобы решить эту ошибку, вы можете решить использовать решение в соответствии с уровнем вашей проблемы:

Возможное решение 1:

Возможно, вы оставили пробелы до или после (в конце файла после?>), Т.е.

 THERE SHOULD BE NO BLANK SPACES HERE <?php echo "your code here"; ?> DO CHECK FOR BLANK SPACES HERE AS WELL; THIS LINE (blank line) SHOULD NOT EXIST. 

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

Примечание. Иногда EDITOR (IDE), например gedit (стандартный Linux-редактор), добавляет одну пустую строку в файл save save. Этого не должно быть. Если вы используете linux. вы можете использовать редактор VI для удаления пробела / строк после?> в конце страницы.

Если это не ваше дело, тогда вы можете использовать ob_start для буферизации вывода, как показано ниже:

Возможное решение 2:

 <?php ob_start(); // code ob_end_flush(); ?> 

Вместо приведенной ниже строки

 //header("Location:".ADMIN_URL."/index.php"); 

записывать

 echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>"); 

или

 ?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php 

Это определенно решит вашу проблему. Я столкнулся с одной и той же проблемой, но решил решить эту проблему путем написания заголовка.

Вы делаете

 printf ("Hi %s,</br />", $name); 

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

Именно из-за этой строки:

 printf ("Hi %s,</br />", $name); 

Вы не должны печатать / эхо ничего перед отправкой заголовков.

Простой совет: простое пространство (или невидимый специальный символ) в вашем скрипте, прямо перед самым первым <?php , может вызвать это! Особенно, когда вы работаете в команде, а кто-то использует «слабую» IDE или перепутал файлы со странными текстовыми редакторами.

Я видел эти вещи;)

Другая неправильная практика может вызвать эту проблему, которая еще не указана.

См. Этот фрагмент кода:

 <?php include('a_important_file.php'); //really really really bad practise header("Location:A location"); ?> в <?php include('a_important_file.php'); //really really really bad practise header("Location:A location"); ?> 

Все в порядке, не так ли?

Что, если «a_important_file.php»:

 <?php //some php code //another line of php code //no line above is generating any output ?> ----------This is the end of the an_important_file------------------- 

Это не будет работать? Почему? Потому что уже создана новая строка.

Теперь, хотя это не общий сценарий, что, если вы используете среду MVC, которая загружает большое количество файлов перед передачей данных на ваш контроллер? Это не необычный сценарий. Будьте готовы к этому.

Из PSR-2 2.2:


  • Все файлы PHP ДОЛЖНЫ использовать окончание Unix LF (linefeed) line ending .
  • Все файлы PHP ДОЛЖНЫ заканчиваться single blank line .
  • Тег закрытия?> ДОЛЖЕН быть omitted из файлов, содержащих only php

Поверьте мне, следующие стандарты могут сэкономить вам много часов из вашей жизни 🙂

использование

ob_start ();

на самом верху вашего скрипта и

ob_end_flush ();

в нижней части вашего скрипта. Этот wil включит буферизацию вывода, и ваши заголовки будут созданы после того, как страница будет буферизована.

ОБЩИЕ ПРОБЛЕМЫ:

====================

(скопированный ответ из: источник )

1) перед header(.......); не должно быть никакого выхода (т.е. echo.. или HTML-кодов header(.......); команда.

2) удалите любое пробел (или новую строку ) перед тегами <?php и после ?> .

3) ЗОЛОТОЕ ПРАВИЛО! – проверьте, поддерживает ли этот файл php (а также, если вы include другие файлы) UTF8 без кодировки спецификации (а не только UTF-8 ). Это проблема во многих случаях (потому что кодированный файл UTF8 имеет что-то особенное в начале файла php, которое ваш текстовый редактор не показывает) !!!!!!!!!!!

4) После header(...); вы должны использовать exit;

5) всегда используйте ссылку 301 или 302:

 header("location: http://example.com", true, 301 ); exit; 

6) Включите отчет об ошибках. И сообщите об ошибке.

7) Если ни одно из вышеизложенных не помогает, используйте перенаправление JAVSCRIPT (однако, сильно не рекомендуемый метод), может быть последним шансом в пользовательских случаях …:

 echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit; 

Иногда, когда в процессе dev есть обе рабочие станции WIN и системы LINUX (хостинг), а в коде вы не видите никакого вывода перед соответствующей строкой, это может быть форматирование файла и отсутствие линии Unix LF (linefeed), заканчивающейся ,

Что мы обычно делаем, чтобы быстро исправить это, переименуйте файл, а в системе LINUX создайте новый файл вместо переименованного, а затем скопируйте его в него. Много раз это решает проблему, поскольку некоторые из файлов, которые были созданы в WIN, когда-то перемещенные на хостинг, вызывают эту проблему.

Это исправление является простым решением для сайтов, которыми мы управляем по FTP, и иногда может сэкономить нашим новым членам команды некоторое время.

Как правило, эта ошибка возникает, когда мы отправляем заголовок после эха или печати. Если эта ошибка возникает на определенной странице, убедитесь, что страница не повторяет ничего перед вызовом start_session() .

Пример непредсказуемой ошибки:

  <?php //a white-space before <?php also send for output and arise error session_start(); session_regenerate_id(); //your page content 

Еще один пример:

 <?php includes 'functions.php'; ?> <!-- This new line will also arise error --> <?php session_start(); session_regenerate_id(); //your page content 

Вывод: не выводить символ перед вызовом функций session_start() или header() даже не в виде пробела или новой строки