Я не помню, чтобы у меня было много проблем с использованием 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"]
возвращает результаты из экземпляра, вызванного при открытии страницы и не отражая вновь установленное значение? Если это так, то почему?
setcookie
устанавливает заголовки для отправки обратно клиенту, чтобы установить файл cookie. Новый файл cookie не будет доступен в массиве $_COOKIE
(который содержит файлы cookie, отправленные с клиента) до следующего запроса.
Ниже приведен упрощенный ход событий, когда пользователь обращается к вашей странице:
$_COOKIE
(а также $_GET
, $_POST
и т. Д.) На основе данных в этом запросе. setcookie
себе через header
, а также заголовки для файлов cookie, установленные через setcookie
). Все заголовки должны предшествовать выводам любой страницы (как вы могли столкнуться, PHP даст вам сообщение об ошибке, если вы попытаетесь отправить больше заголовков после того, как вы начали выводить содержимое страницы). Таким образом, к тому времени, когда заголовок set-cookie будет получен и обработан клиентом, клиент уже выполнит связь с сервером, поэтому cookie не будет отображаться в PHP до следующего запроса.
Из документации setcookie от PHP.net в разделе «Общие ошибки»:
Куки-файлы не станут видимыми до следующей загрузки страницы, на которой должен отображаться файл cookie. Чтобы проверить, был ли файл cookie успешно установлен, проверьте, будет ли файл cookie на следующей странице загрузки до истечения срока действия файла cookie.
вы можете напрямую переписать суперглобал.
$ 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;