|
Почетный модератор
11561 / 4356 / 453
Регистрация: 12.06.2008
Сообщений: 12,457
|
|||||||||||||||||||||||||||||||||||||||||
Что означает предупреждение "headers already sent"09.08.2011, 11:14. Показов 108254. Ответов 76
На форуме часто бывают вопросы, что при использовании session_start(), header() и setcookie() и некоторых других функций, появляется сообщения типа
Если кому интересны подробности, то вот немного теории
Давайте разберёмся, что происходит, когда мы заходим на сайт. Например, когда мы в браузере открываем страницу http://www.example.ru/file.php, то браузер запрашивает у DNS сервера, какой IP адрес принадлежит серверу www.example.ru. После этого он подключается по протоколу TCP к этому IP адресу на порт 80 (этот порт используется по умолчанию для HTTP) и отправляет текстовый запрос наподобие такого:
Так же обязательным является параметр Host. Т.к. на каждом сервере может быть несколько разных сайтов, то мы должны указать, к какому именно сайту мы хотим обратиться. Остальные параметры необязательны... ими браузер просто рассказывает о себе (User-Agent) и рассказывает серверу, как он хочет общаться. Но сейчас речь не об этом... В ответ на этот запрос веб-сервер запускает выполнение нашего php-скрипта, к которому обращается браузер. И веб-сервер отправляет браузеру результат работы скрипта... но перед этим он отправит свои заголовки ответа.
И вот мы подошли к основной сути... когда PHP приказывает веб-серверу начать отправлять само содержимое брузеру, то веб-серверу не остаётся ничего, кроме как отправить вначале все заголовки, которые имеются у него на текущий момент. Поэтому после этого PHP уже не сможет изменить эти заголовки. Функция header() изменяет любой заголовок. Функция setcookie() добавляет куки к заголовку Set-Cookie, поэтому тоже не может работать после отправки заголовков. session_start() добавляет куки с идентификатором сессии (как в примере выше). А пока найдём пути решения этой проблемы. Чаще всего такие ситуации происходят из-за использования BOM. BOM - это 2 или 3 невидимых символа в начале файла. Эти символы указывают на то, какая используется кодировка. Многие текстовые редакторы по умолчанию добавляют BOM ко всем файлам юникодовской кодировкой (например UTF-8). Например, создадим в блокноте файл
Я вижу 2 пути решения это проблемы: 1. Включить в php.ini
2. Запретить текстовому редактору сохранять BOM. Но тут уже всё зависит от возможностей текстового редактора, который вы используете. Например, я пользуюсь Notepad++... там можно открыть меню "Кодировки" и выбрать "Преобразовать в UTF-8 без BOM". Если вы уверены, что BOM не используется, значит где-то перед функциями header(), setcookie() и т.п. вы сами отправляете данные пользователю. Возможно, перед открытием тега <?php есть пустая строка... её тоже нужно убрать. Если вначале вам необходимо отправлять данные, то можно включить использование буфера, что бы данные не отправлялись сразу браузеру:
57
|
|||||||||||||||||||||||||||||||||||||||||
| 09.08.2011, 11:14 | |
|
Ответы с готовыми решениями:
76
Что означает предупреждение " comparison between signed and unsigned integer expressions" Выходит предупреждение headers already sent by Событие A означает, что извлечены 3 зеленых, а событие В - извлечены 3 красных леденца. Что означает сумма А или B? |
|
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
|
|
| 24.09.2019, 18:32 | |
|
Что означает предупреждение "headers already sent" слишком поздно отправляешь заголовки , так как запрос уже был отправлен частично подними выше по коду....
0
|
|
|
11 / 11 / 2
Регистрация: 13.07.2014
Сообщений: 420
|
|||||||||||
| 20.11.2019, 09:35 | |||||||||||
|
Здравствуйте, что-то я замучился. Перечитал и про BOM из UTF-8 нюанс, убрал везде это, про всякие пробелы в начале файлов, всё это просмотрел. Не помогает. Я ещё делаю пример из книги, не моя структура. И тем паче не понимаю в чём дело.
Ошибка возникает тут на последней строке (ну само собой на команде header). "Cannot modify header information - headers already sent by (output started at W:\domains\temp\include\header.html:1) in W:\domains\temp\process.php on line 38"
А вот этот W:\domains\temp\include\header.html
0
|
|||||||||||
|
3901 / 3239 / 1353
Регистрация: 01.08.2012
Сообщений: 10,917
|
|
| 20.11.2019, 11:26 | |
|
1
|
|
|
Почетный модератор
11561 / 4356 / 453
Регистрация: 12.06.2008
Сообщений: 12,457
|
|||||||||||||||||
| 20.11.2019, 11:36 [ТС] | |||||||||||||||||
|
Возможно, тут у вас происходит путаница о том, что такое header из-за имени фала header.html. Есть протокол HTTP, который состоит из заголовков и данных. Заголовки как раз передаются через функцию header(), а данные выводятся через echo, в обход тегов <?php и т.п. Т.е, когда вы вызываете
Например, когда вы выполняете код:
Если включена буферезация, то PHP не начинает сразу передавать данные браузеру, а вначале накапливает их у себя в памяти. И только когда размера буфера не хватает или вы ему явно дали команду отправить буфер, только в этом случае он отправляет все накопленные заголовки и данные браузеру.
1
|
|||||||||||||||||
|
11 / 11 / 2
Регистрация: 13.07.2014
Сообщений: 420
|
||
| 20.11.2019, 12:01 | ||
|
И кстати, а в header.html что именно считается за вывод? Добавлено через 37 секунд Humanoid, ой только сейчас увидел сообщение, сейчас буду читать, спасибо! Добавлено через 14 минут Humanoid, спасибо за такой подробный ответ! Я ещё его пару раз перечитаю и обдумаю, сразу всё вразумить непросто. Хотя вчера уже и гуглил, читал про это частично. А вы всё подробно описали. Не понимаю только почему автор учебной книги написал такой код и даже не уточнил про все эти нюансы.
0
|
||
|
3901 / 3239 / 1353
Регистрация: 01.08.2012
Сообщений: 10,917
|
|
| 20.11.2019, 12:32 | |
|
0
|
|
|
11 / 11 / 2
Регистрация: 13.07.2014
Сообщений: 420
|
||
| 20.11.2019, 12:45 | ||
|
Книга - PHP 7 для начинающих. с 218 по 230 страницу. Но там страницы небольшие, страница за 10-15 секунд просматривается если по-беглому. На 226-ой конкретно тот process.php П.С Ой, правда header.html на 189 странице.
0
|
||
|
3901 / 3239 / 1353
Регистрация: 01.08.2012
Сообщений: 10,917
|
||||||
| 20.11.2019, 13:07 | ||||||
|
Masai, да, это косяк учебника. Да и сам код "попахивает".
0
|
||||||
|
11 / 11 / 2
Регистрация: 13.07.2014
Сообщений: 420
|
||
| 20.11.2019, 14:06 | ||
|
Благо эта книга уже заканчивается. Добавлено через 52 минуты Jodah, вы вот код коль там уж проанализировали, не подскажите как его изменить чтоб заработало? Я всё же потратил время чтоб всё это переписать из книги, хочется всё же видеть сообщения на этом "форуме". Повторюсь я пробовал инклюдить header.html на 39-ую строку, ошибка пропадала эта, сообщения отправлялись вроде как, но ничего не отображалось, лишь пустота (на forum.php). Или как советовал Humanoid надо врубить в самом начале буферизацию и только такое спасение для этого несчастного кода? Я вроде бы пробовал и тот ob_start(). Но и в таком случае не отображалось всё Просто я понял как бы суть проблемы, но я слишком слаб чтоб понять как поступить в данном случае..
0
|
||
|
Почетный модератор
11561 / 4356 / 453
Регистрация: 12.06.2008
Сообщений: 12,457
|
|||||||
| 21.11.2019, 01:40 [ТС] | |||||||
|
Вообще, код очень странный. Внутри условия "if(isset($_POST['message']))" делается подключение к БД "require('../connect_db.php')" и делается запрос к БД. А потом после этого условия вычитывается количество полученных в ходе запроса строк. Получается, что если в условие не попали (например, если это не POST-запрос), то сразу выполняется "mysqli_affected_rows($dbc)", при том, что переменная $dbc не была объявлена (скорее всего, она объявляется в connect_db.php). Поэтому PHP и валится, т.к. для этой функции должен передаваться какой-то хендл базы данных, а передаётся несуществующая переменная. В общем, выглядит так, что строки 32-39 должны быть внутри условия (между строками 30 и 31). Тогда PHP не должен падать, но и отображать ему тоже нечего, т.к. тут ожидается POST-запрос, а для GET он ничего не отображает. Где-то должна быть страница с формой, которая при нажатии кнопки отправляет данные на этот скрипт.
Наверное, должно быть примерно так
1
|
|||||||
|
11 / 11 / 2
Регистрация: 13.07.2014
Сообщений: 420
|
|||||||||||||
| 23.11.2019, 09:40 | |||||||||||||
|
Решил научиться удалять сразу все сообщения БД. Наверно крайне криво (в книге вообще нету про это и я знаю, что легко всё удалить через админку, но захотелось в коде). Добавил на forum.php это:
И создал файлик delete.php (правда основу кода я гуглил, пока сам запутаюсь такое написать, я лишь подкорректировал):
Сразу показалось, что книга конечно очень поверхностная. Автор начинает темы с MySQL но так вообще не описывает детали. Почитал ваши комментарии по поводу подхода автора и его кода и в ужас пришёл. Хорошо, что книга заканчивается уже.
0
|
|||||||||||||
|
Почетный модератор
11561 / 4356 / 453
Регистрация: 12.06.2008
Сообщений: 12,457
|
||||||||||||||||
| 23.11.2019, 12:45 [ТС] | ||||||||||||||||
|
Кстати, рекомендую сразу писать запросы к БД правильно. В функциях mysqli (да и в PDO тоже) есть два способа отправить запрос к базе данных:
1. mysqli_query() 2. mysqli_prepare() / mysqli_stmt_bind_param() / mysqli_stmt_execute() Первый способ подходит только в том случае, когда в запрос не нужно вставлять переменные. Например, как в вашем последнем сообщении... там запрос - это единая строка без использования каких-то вставленных переменных. Точнее, переменные можно вставлять, но только если они константные, а не получены от пользователя. Например:
1
|
||||||||||||||||
|
11 / 11 / 2
Регистрация: 13.07.2014
Сообщений: 420
|
|
| 26.11.2019, 09:47 | |
|
Humanoid, спасибо за полезную информацию! Надо бы мне это в памятку занести, запомнить. Интересно.
Столько нюансов. Хотя если пообвыкнуться то несложно. Надо про все эти функции почитать просто. Кстати по поводу той книги, после той истории последней там была ещё одна последняя тема, опять всё не работало, благо это было последнее в этой книге и наконец я с ней покончил. Эта книга годится только с синтаксисом ознакомиться. Вторая книга интересней и третья. П.С Кстати, не уточните, что тут происходит? $condition = "id = $id"; Это будет строковой переменной у которой значение "id = (текст пришедший из POST запроса)" - т.е просто такой Текст?
0
|
|
|
Почетный модератор
11561 / 4356 / 453
Регистрация: 12.06.2008
Сообщений: 12,457
|
||
| 26.11.2019, 10:53 [ТС] | ||
|
$condition = "id = $id" переменная $condition будет содержать строку "id = 123"
0
|
||
|
0 / 0 / 2
Регистрация: 30.11.2018
Сообщений: 32
|
|
| 12.05.2021, 10:01 | |
|
Ошибка "Заголовки уже отправлены" у начинающих программировать на РНР может иметь следующие причины:
1 - Не нужно писать Echo везде и подряд. В коде Echo должно быть одно. Особенно когда в коде используются функции из внешних, подключённых через include или recuire, файлов. 2 - Посторонние служебные символы перед <?PHP. Скопируйте весть код, создайте пустой файл в блокноте, сохраните в нужной кодировке и вставьте туда код. 3 - session_start(); только в самом начале кода, второй строкой полсе <?PHP
0
|
|
|
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
|
||
| 12.05.2021, 13:52 | ||
session_start, пересохранений во всевозможных кодировках и т.д.
1
|
||
|
0 / 0 / 0
Регистрация: 01.09.2021
Сообщений: 1
|
||
| 01.09.2021, 19:03 | ||
|
0
|
||
| 01.09.2021, 19:03 | |
|
Постоянные ошибки с сессиями (headers already sent и Cannot modify headers) Что означает появление письменности (языка), и что означает реформа письменности (языка)? Что означает, что определение метода находится внутри определения класса? Поясните пожалуйста что означает двоеточие и то что идет после него Что такое dy1 и dy2 в программе, и зачем мы их перемножаем. Что означает строчка x=x1 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|