我正在尝试使用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,他也会收到错误消息。
任何人都有这方面的线索吗? 提前谢谢
答案 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设置一个新的,你可以直接在第一页加载时获得值。为什么?必须有更准确的解释。为什么两种不同的行为此输出/数据可用性的顺序是否取决于对服务器的浏览器请求?有趣的是......