$ _COOKIE [], кажется, не отражает изменения после установки - PullRequest
4 голосов
/ 31 августа 2010

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

(я работаю на локальном хосте, отсюда мой домен)

<?php
$sessionCookie = rand();
setcookie("crav_auto_login_cookie", $sessionCookie, false,"/crav/", false);
echo "Cookie Set<br/>";
echo "Cookie equals: ".$_COOKIE["crav_auto_login_cookie"]."<br/>";
echo "should equal: ". $sessionCookie;
?>

Это приведет к следующему выводу:

Cookie SetCookie equals: 457718770should equal: 318511886

Я явно что-то упускаю, но не уверен, почему значения разные.Это потому, что при загрузке страницы загружаются файлы cookie, а $_COOKIE["crav_auto_login_cookie"] возвращает результаты из экземпляра, вызванного при открытии страницы, и не отражает вновь установленное значение?Если это так, то почему?

Ответы [ 3 ]

5 голосов
/ 31 августа 2010

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

Вот упрощенныйразвитие событий, когда пользователь заходит на вашу страницу:

  1. Браузер пользователя отправляет на ваш сервер запрос .Этот запрос содержит заголовки, включая файлы cookie, установленные для этого пользователя для вашего домена.PHP заполняет массив $_COOKIE (а также $_GET, $_POST и т. Д.) На основе данных в этом запросе.
  2. Сервер анализирует запрос пользователя и устанавливает ответ .Этот ответ начинается с заголовков ответов (включая любые заголовки, которые вы сами задали с помощью header, а также заголовки для файлов cookie, установленные с помощью setcookie).Все заголовки должны предшествовать любому выводу страницы (как вы могли столкнуться, PHP выдаст вам ошибку, если вы попытаетесь отправить больше заголовков после того, как вы начали выводить содержимое страницы).
  3. Сервер отправляет содержимое страницы (в действительности заголовки и содержимое являются частью одной и той же передачи).
  4. Соединение между сервером и клиентом закрывается (давайте игнорируем AJAX для целей этого обсуждения).
  5. Клиент анализируетзаголовки и полученное содержимое, при необходимости устанавливает файлы cookie и отображает страницу (на самом деле, это вполне может произойти последовательно с получением страницы).

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

1 голос
/ 17 августа 2012

вы можете перезаписать суперглобальный файл напрямую.

$ sessionCookie = rand ();
setcookie ("crav_auto_login_cookie", $ sessionCookie, false, "/ crav /", false);$ _COOKIE ["crav_auto_login_cookie"] = $ sessionCookie;

echo "Cookie Set";
echo "Cookie равно:". $ _ COOKIE ["crav_auto_login_cookie"];
echo "должно быть равно:".$ SessionCookie;

1 голос
/ 31 августа 2010

Из документации setcookie PHP.net в разделе "Типичные ловушки":

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...