在Firefox中清除历史记录后,无法首次设置Cookie

时间:2011-11-14 16:07:20

标签: php session cookies

我正在尝试使用PHP中的cookie设置会话管理。 我的代码如下:

  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,他也会收到错误消息。

任何人都有这方面的线索吗?   提前谢谢

2 个答案:

答案 0 :(得分:1)

当您执行setcookie调用时,将在标头输出到浏览器时发送cookie。这意味着在下一页加载(当客户端将cookie发送回服务器时)之前,cookie将不可用。这在setcookie http://php.net/manual/en/function.setcookie.php的php手册中提到:

  

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

     

设置好Cookie后,可以使用$ _COOKIE或$ HTTP_COOKIE_VARS数组在下一页加载上访问这些Cookie。注意,$ _COOKIE等超级全局变量在PHP 4.1.0中可用。 Cookie值也存在于$ _REQUEST中。

在页面重新加载(从php)之前,您将无法确定是否启用了Cookie。我想你必须用javascript做这个检查,或者在第一次设置cookie之后留在php做一个重定向,例如:

    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;

答案 1 :(得分:0)

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