2010-08-31 3 views
4

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

(я бегу на локальном хосте, поэтому мои настройки домена)

<?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 Set
Cookie equals: 457718770
should equal: 318511886

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

ответ

5

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

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

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

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

+0

Спасибо, я как раз заметил его после немного более играя вокруг. –

+0

приятное объяснение! –

1

От PHP.net's setcookie documentation под «Common Ловушки»:

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

+0

есть. Я просто заметил, что новый набор становится доступным при загрузке следующей страницы. Думаю, я никогда не пробовал настраивать и получать cookie в одном скрипте, поэтому я даже не думал об этом: P –

1

Вы можете переписать суперглобал непосредственно.

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

echo "Cookie Set";
echo "Cookie equals:". $ _ COOKIE ["crav_auto_login_cookie"];
Эхо "должно равняться:". $ SessionCookie;

Смежные вопросы