8.6 Почему setcookie() и session_start() хотят быть в верхней части страницы

Последнее обновление: вс, 03 апреля 2022 г. | Изучение PHP

Когда веб-сервер отправляет ответ веб-клиенту, большая часть этого ответа представляет собой HTML-документ, который браузер отображает в виде веб-страницы на вашем экране: суп из тегов и текста, который Internet Explorer или Mozilla форматирует в таблицы или изменяет цвет или размер. Но перед этим HTML представляет собой раздел ответа, содержащий заголовки. Они не отображаются на вашем экране, а являются командами или информацией с сервера для веб-клиента. Заголовки говорят такие вещи, как «эта страница была создана в такое-то время», «пожалуйста, не кэшируйте эту страницу» или (и то, что здесь уместно) «пожалуйста, помните, что файл cookie с именем userid имеет Цени Ральфа».

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

Как только часть тела отправлена ​​— даже одна строка — заголовки больше не могут быть отправлены.

Такие функции, как setcookie() и session_start(), добавляют к ответу заголовки. Для правильной отправки добавленных заголовков их необходимо добавить до начала любого вывода. Вот почему они должны вызываться перед любыми операторами печати или любым HTML-кодом, появляющимся вне тегов PHP.

Если какие-либо выходные данные были отправлены до вызова setcookie() или session_start(), интерпретатор PHP выводит сообщение об ошибке следующего вида: /htdocs/catalog.php:2) в /www/htdocs/catalog.php в строке 4

Это означает, что строка 4 catalog.php вызвала функцию, которая отправляет заголовок, но что-то уже было напечатано строкой 2 каталога .php.

Если вы видите сообщение об ошибке «заголовки уже отправлены», тщательно проверьте свой код на наличие ошибочного вывода. Прежде чем вызывать setcookie() или session_start(), убедитесь, что нет операторов печати. Убедитесь, что перед первым — даже пустых строк.

Альтернативой поиску вредоносных пустых строк в ваших файлах является использование буферизации вывода. Это говорит интерпретатору PHP подождать с отправкой любого вывода, пока он не завершит обработку всего запроса. Затем он отправляет любые установленные заголовки, а затем весь обычный вывод. Чтобы включить буферизацию вывода, установите для директивы конфигурации output_buffering значение On в конфигурации вашего сервера. Веб-клиентам приходится ждать несколько дополнительных миллисекунд, чтобы получить содержимое страницы с вашего сервера, но вы экономите мегасекунды, исправляя свой код, чтобы весь вывод происходил после вызовов setcookie() или session start().

При включенной буферизации вывода вы можете смешивать операторы печати, функции cookie и сеанса, HTML за пределами тегов

и обычный код PHP, не получая ошибки «заголовки уже отправлены». Программа в примере 8.19 работает только при включенной буферизации вывода. Без него HTML-код, напечатанный перед стартовым тегом

Продолжить чтение здесь: Пример 9-10. Меню выбора дня с помощью input_select()

Была ли эта статья полезной?

Серверный PHP: часть 4: $_COOKIE — цифровая эфемера

Перейти к содержимому

On

11 мая 2019 г. By Dan CoxIn code, Howto, PHP

PHP на стороне сервера

  • Часть 1: Вывод сервера
  • Часть 2: $_SERVER
  • Часть 3: $_GET, $_PUT и $_REQUEST
  • Часть 4: $_COOKIE
  • Часть 5: $009 4ESS 9

    PHP – это язык программирования, часто используемый для веб-разработки на стороне сервера.


    $_COOKIE

    Суперглобальный $_COOKIE содержит все ранее созданные файлы cookie. Подобно $_GET и $_SET , это массив, содержащий информацию, отправляемую клиентам и от них.

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

    setcookie()

    Для доступа к файлу cookie он должен сначала существовать. Функция setcookie() создает файлы cookie. Однако, как предупреждает справочная страница PHP, использование этой функции должно произойти до другие функции из-за ограничений протокола. Использование setcookie() должно быть одним из первых действий, выполняемых в файле, который его содержит.

    Доступ к файлам cookie

    Для любого имени, заданного с помощью функции setcookie() , значение файла cookie будет существовать в массиве $_COOKIE в качестве этого ключа.

    Файлы cookie также существуют после их создания. Хотя это может иметь смысл на поверхностном уровне, большая глубина концепции часто привлекает новых разработчиков.

    Файлы cookie устанавливаются как часть информации заголовка при передаче страницы, частью которой они являются. Следовательно, они не существуют до тех пор, пока страница не будет загружена. Чтобы получить доступ к файлам cookie, страницу необходимо либо обновить, либо иным образом протестировать после полной загрузки страницы, в которой появляется функция setcookie() .

    Нравится:

    Нравится Загрузка…

    PHPСерверный PHP

    Дэн Кокс: читатель, писатель, программист, а иногда и человек.

    Часто встречается в классах; в большинстве случаев безвредна.


    Социальные сети:


    Контакт: dan.cox [в] videlais.com

    • Обновление Snowman Dev (2.2 -> 3.0: 10 июля 2022 г.) 10 июля 2022 г.
    • Сохранение прошлых форматов историй Twine 2 9 июля 2022 г.
    • Обновление Snowman Dev (2.2: 3 июля 2022 г.) 3 июля 2022 г.
    • Обновление Snowman Dev (2.2: 26 июня 2022 г.) 26 июня 2022 г.
    • Обновление Snowman Dev (2. 2: 19 июня 2022 г.) 19 июня 2022 г.

    #TwineTuesday игра-эссе по дизайну кода с практическими рекомендациями Ink JavaScript игра в Ren’Py обзор обучение шпагату видеоигры по вторникам

    Архив Выберите месяц Июль 2022 (3) Июнь 2022 (7) Май 2022 (1) Февраль 2022 (1) Январь 2022 (1) Октябрь 2021 (1) Июль 2021 (1) Июнь 2021 (3) Май 2021 (5) Апрель 2021 ( 2) март 2021 г. (4) февраль 2021 г. (10) январь 2021 г. (10) ноябрь 2020 г. (2) октябрь 2020 г. (3) сентябрь 2020 г. (2) август 2020 г. (3) июнь 2020 г. (1) март 2020 г. (3) февраль 2020 г. ( 3) январь 2020 г.  (3) декабрь 2019 г.(23) июль 2019 г. (6) июнь 2019 г. (9) май 2019 г. (35) январь 2019 г. (23) декабрь 2018 г. (48) ноябрь 2018 г. (14) октябрь 2018 г. (19) сентябрь 2018 г. (21) август 2018 г. (23) июль 2018 г. (21) июнь 2018 г. (3) май 2018 г. (2) апрель 2018 г. (7) январь 2018 г. (1) сентябрь 2017 г. (2) июль 2017 г. (1) июнь 2017 г. (2) январь 2017 г. (11) декабрь 2016 г. (3) ноябрь 2016 г. (1) Октябрь 2016 г. (3) Сентябрь 2016 г.