使用setcookie检测cookie集而无需重新加载页面

时间:2016-11-23 19:03:54

标签: php session cookies

我正在维护电子商务网站的代码,他们使用的是osCommerce v2.2 RC2的高度修改版本。注意到在新用户访问网站的第二页之前没有为新用户启动会话的问题。

查看代码,在开始会话之前,它会尝试设置cookie。如果它检测到cookie,则启动会话。这条线上的东西:

setcookie('cookie_test', 'please_accept_for_session', time()+60*60*24*30, $cookie_path, $cookie_domain);

if (isset($_COOKIE['cookie_test'])) {
      session_start();
...

我在这里找到一个article来讨论这样的情况,它说:

  

当您第一次告诉浏览器设置cookie时,请求标头中没有cookie数据(可以从$ _COOKIE获取)。

这解释了为什么会话需要两次页面加载才能启动。一个用于设置cookie,另一个用于从浏览器获取设置cookie的通知。

我的问题是,是否还有必须通过两个页面加载来检测用户浏览器上是否已成功设置Cookie?

我发现这个question并没有完全回答我的问题。投票最高的解决方案是:

setcookie('uname', $uname, time()+60*30);
$_COOKIE['uname'] = $uname;

这可能使它"工作"但它并没有真实告诉我脚本能够成功设置cookie。

我还发现了这个question,建议访问headers_list以查找cookie信息,如下所示:

function getcookie($name) {
    $cookies = [];
    $headers = headers_list();
    // see http://tools.ietf.org/html/rfc6265#section-4.1.1
    foreach($headers as $header) {
        if (strpos($header, 'Set-Cookie: ') === 0) {
            $value = str_replace('&', urlencode('&'), substr($header, 12));
            parse_str(current(explode(';', $value, 1)), $pair);
            $cookies = array_merge_recursive($cookies, $pair);
        }
    }
    return $cookies[$name];
}
// [...]
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . getcookie('uname');

再次,似乎并没有验证cookie是否已成功设置。所有这一切似乎都是搜索发送到浏览器的标题以获取cookie值。

我能想到的唯一解决方案是在设置cookie后重定向第一次访问。还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

以下是答案:

<?php

function set_cookie($name, $value) {
    if (!isset($_COOKIE[$name]) || ($_COOKIE[$name] != $value)) {
        $_COOKIE[$name] = $value;
    }
    setcookie($name, $value, strtotime('+1 week'), '/');
}

// Usage:
set_cookie('username', 'ABC'); //Modify the value to see the change 

echo $_COOKIE['username'];