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

Php 在Firefox中清除历史记录后,无法首次设置Cookie,php,session,cookies,Php,Session,Cookies,我正在尝试用PHP中的cookies设置会话管理。 我的代码如下: if(empty($_COOKIE )) { setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT)); } $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0; 然后,我将检查会话\u id是否为0,并在禁用Cookie时打印错误消息。 如果

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

  if(empty($_COOKIE )) {
    setcookie('session_id', md5(uniqid()), time()+(EXPIRE CONSTANT));
  }
  $session_id = isset($_COOKIE['session_id']) ? $_COOKIE['session_id'] : 0;
然后,我将检查会话\u id是否为0,并在禁用Cookie时打印错误消息。 如果Cookie真的被禁用了,这就可以了

问题是,如果用户第一次访问时清除了历史记录 即使启用了Cookie,站点管理员也会收到错误消息

有人对此有任何线索吗?
提前感谢您

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

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

一旦设置了COOKIE,就可以使用$\u COOKIE或$HTTP\u COOKIE\u VARS数组在下一页加载时访问它们。请注意,PHP4.1.0中提供了超全局变量,如$_COOKIE。Cookie值也存在于$\u请求中

在重新加载页面(从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;

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

这方面的问题是,如果禁用cookie,用户将始终重定向到index.php,因此陷入循环。如果不使用$GET变量,是否仍要进行检查?您不必重定向到index.php,您可以使用$服务器['REQUEST\u URI']重定向到当前页面,以获取用户当前所在的页面。或者在我说的放置错误的地方,您可以重定向到另一个显示错误的页面,或者显示错误并停止处理。这取决于你想做什么。