2011-11-14 44 views
0

清除历史,我想建立一个会话管理与PHP饼干后第一次设置。 我的代码如下:Cookie不能在Firefox

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

我会再检查SESSION_ID为0,如果禁用cookie打印错误消息。 这工作正常,如果cookie真的被禁用。

问题是,如果用户在第一次访问 网站时清除了他的历史记录,即使启用了cookie,他也会收到错误消息。

任何人对此有任何线索? 预先感谢您

回答

1

当你做对的setcookie呼叫,当标题输出到浏览器的cookie将被发送。这意味着在下一页加载(当客户端将cookie发回服务器时),cookie将不可用。这是在php手册中提到的setcookie http://php.net/manual/en/function.setcookie.php

setcookie()定义了一个cookie,与其余的HTTP头一起发送。像其他标题一样,Cookie必须在脚本输出之前发送(这是协议限制)。这要求您在任何输出之前调用此函数,包括标记以及任何空格。

一旦饼干已经确定,就可以把他们下次访问该页面加载与$ _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

这个问题是,如果禁用cookie的用户将始终重定向到的index.php - 因此陷入了一种循环。反正有没有使用$ _GET变量进行检查? – user1045922

+0

你不必重定向到的index.php,你可以重定向到使用$ _ SERVER [“REQUEST_URI”]来获得页面的用户目前已对当前页面。或者我说过要将错误重定向到显示错误的其他页面,或显示错误并停止处理。这取决于你想要做什么。 – bencoder

0

@bencoder:我已经在iPad上做了测试和Chrome/PC:你是对的iPad,你需要刷新页面,您可以读取cookie数据之前,而Chrome/PC上删除所有cookie后,如果您设置PHP一个新的,可以完美得该值直接在第一页加载。为什么?必须有更精确的解释。为什么两种不同的行为此输出/数据可用性的顺序是否取决于浏览器对服务器的请求?有趣的是知道......