Cookies не могут быть установлены в первый раз после очистки истории в Firefox - PullRequest
0 голосов
/ 14 ноября 2011

Я пытаюсь настроить управление сеансом с помощью файлов cookie в PHP.Мой код выглядит следующим образом:

  if(empty($_COOKIE )) {
    setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT));
  }
  $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0;

Затем я проверю session_id на 0 и выведу сообщение об ошибке, если куки отключены.Это работает нормально, если куки действительно отключены.

Проблема в том, что если пользователь очищает свою историю при первом посещении сайта, он получит сообщение об ошибке, даже если куки включены.У кого-нибудь есть какие-либо подсказки по этому поводу?Заранее спасибо

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Когда вы выполняете вызов setcookie, файлы cookie будут отправляться при выводе заголовка в браузер. Это означает, что cookie не будет доступен до следующей загрузки страницы (когда клиент отправляет cookie обратно на сервер). Это упоминается в руководстве по php для setcookie http://php.net/manual/en/function.setcookie.php:

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

После того, как куки установлены, к ним можно получить доступ при загрузке следующей страницы с массивами $ _COOKIE или $ HTTP_COOKIE_VARS. Обратите внимание, суперглобальные переменные, такие как $ _COOKIE, стали доступны в PHP 4.1.0. Значения cookie также существуют в $ _REQUEST.

Вы не сможете определить, включены или отключены файлы cookie, пока страница не будет перезагружена (с php). Я думаю, вам придется выполнить эту проверку с помощью javascript, или чтобы остаться в php, сделайте редирект после первой установки cookie, что-то вроде:

    if(empty($_COOKIE)) {
            if (isset($_GET['cookieset'])) {
                    // do error message, cookie should be set
            }
            setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT));
            header('location: http://mysite.com/index.php?cookieset=1');
            exit;
    }
    $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0;
0 голосов
/ 05 октября 2012

@ bencoder: я провел тест на iPad и Chrome / ПК: вы подходите для iPad, вам нужно обновить страницу, прежде чем вы сможете прочитать данные cookie, но на Chrome / PC после удаления всех cookieесли вы установите новый из PHP, вы можете получить значения непосредственно при загрузке первой страницы.Зачем ?Там должно быть более точное объяснение.Почему два разных поведения?Порядок этих выводов / доступности данных зависит от запроса браузера к серверу?Интересно знать ...

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