Не удается отправить сеанс cookie – уже отправленные заголовки

Возможный дубликат:
Заголовки, уже отправленные PHP

Ниже приведен простой пример моего PHP-кода, который (я надеюсь, что так) объясняет сам. Я пытаюсь обновить переменную сеанса. Но вывод скрипта выглядит следующим образом:

Предупреждение: session_start () [function.session-start]: не удается отправить файл cookie сеанса – уже отправленные заголовки (вывод запущен в /Library/WebServer/Documents/facebook/test.php:8) в / Library / WebServer / Documents / facebook /test.php в строке 11

Предупреждение вызвано сообщениями echo в строках 8 и 9, конечно. Есть ли простое решение, чтобы остановить это предупреждение.

Спасибо за любые указатели, Андрей

 <?php session_start(); $_SESSION['percent'] = 0; $iterations = 50; for ($i = 0; $i <= iterations; $i++) { $percent = ($i / $iterations) * 100; echo "Hello World!"; echo "<br />"; // update session variable session_start(); $_SESSION['percent'] = number_format($percent, 0, '', ''); session_commit(); } ?> 

Единственное решение, которое работает (то есть обновляет переменную сеанса), для меня:

 <?php ob_start(); session_start(); $_SESSION['percent'] = 0; $iterations = 50; for ($i = 0; $i <= 50; $i++) { $percent = ($i / $iterations) * 100; echo "Hello World!"; echo "<br />"; // update session variable session_start(); $_SESSION['percent'] = number_format($percent, 0, '', ''); session_commit(); } ob_flush(); ?> 

Это уродливо, в то время как он сначала буферизует выход …

Невозможно установить файлы cookie (или отправить любые другие заголовки) после запуска выхода. Вы можете добавить ob_start () в строке 1 для буферизации вывода.

Правильное решение – отделить логику от выхода. Проверьте, например, http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=21

Удалите session_start () из цикла for.

Поместите session_commit () вне цикла for в самом конце.

Обе эти функции следует вызывать только один раз в скрипте.

Если у вас нет вывода previeus перед оператором session-start (), попробуйте перезагрузить ваш .php-файл как ansi-файл или как utf-8 без BOM-файла. это bc, в некоторых случаях сам редактор пишет вещи как результат в файле.

Это сработало для меня

Вы должны выполнить функцию session_start() только один раз. Поэтому просто отбросьте один из них.

Также вам не нужно делать session_commit() вручную, в большинстве случаев PHP обрабатывает это для вас автоматически.

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