Cannot modify header information - headers already sent by
1,00
р.
р.
Не сохраняются куки. Что не так. Ошибка Warning: Cannot modify header information - headers already sent by (output started at blocksSite/main_noauth.php:4) in blocksSite/main_noauth.php on line 58
Ответ Общение WEB-сервера с клиентом в данном случае происходит по протоколу HTTP. HTTP включает в себя HTTP заголовки и тело ответа. При этом заголовки обязательно следуют перед телом ответа – того требует стандарт. PHP же в свою очередь в процессе работы должен сформировать и заголовки и тело ответа. Даже если Вы не задаете ни одного заголовка, то PHP сам устанавливает все необходимые заголовки для ответа клиенту. При этом данные, которые необходимо отдать клиенту он записывает сначала в буфер, но если он начал писать в буфер тело ответа, то заголовки он уже никак не может туда записать и встретив попытку записи заголовков ответа уже после того, как начало формироваться тело ответа PHP выдает ошибку: Warning: Cannot modify header information - headers already sent by (output started at ... Это может быть следствием следующих причин: Перед установкой заголовков был вывод тела ответа. При этом вывод может быть осуществлен как средствами шаблонизатора, так и через функции echo или print // вывод средствами шаблонизатора <?php echo "<body>" // вывод средствами оператора header( "Content-Type: text/html charset=utf-8" ) Вы можете банально ошибиться и поставить перед <? пробелы или переносы строк, которые тоже будут восприняты как тело ответа.<br>Ровно так же как и в пункте 2, но в конце php-файла: Файл incrementX.php <?php $x++ ?>[пробел][перенос строки] Файл index.php <?php include( "incrementX.php" ) header( ... ) <br> Файлы, которые содержат PHP-код должны быть сохранены без BOM. Как сохранить файл без BOM. Не забывайте, что если Вы подключаете файлы через include или require, то файлы к которым обращаются эти функции также могут содержать одну из трех вышеперечисленных проблем. include( "include.inc" ) // include.inc может формировать тело ответа header( ... ) Если настроен вывод ошибок в браузер, то warning тоже будет телом ответа: $filename= "" $text= file_get_contents( $filename ) // Warning: file_get_contents(): Filename cannot be empty header( ... )
Самым правильным решением большинства проблем с выводом заголовков является изменение структуры РНР файла таким образом, чтобы весь вывод начинался только после того, как отработала основная логика скрипта. Если же приходится работать с устаревшим кодом где всё вперемешку, можно воспользоваться буферизацией вывода явным образом: <? ob_start() ?> <?php echo "<body>" header("Content-Type: text/html charset=utf-8") ob_end_flush() либо настройками php.ini принудить PHP сперва наполнять буфер данными до определенного размера, и лишь потом отдавать содержимое буфера клиенту, но в этом случае превысив размер буфера Вы увидите Выше описываемую ошибку. output_buffering = 14096