在PHP中没有收到$ _SERVER [“http_referer”]时,setCookie()函数不起作用

时间:2013-07-04 10:33:38

标签: php

我正在尝试使用php中的setCookie函数设置cookie。我第一次启动浏览器时,它无法正常工作。当我重新加载页面时,我正在从服务器接收cookie。这证明当没有收到$ _SERVER [“http_referer”]时,setCookie()函数不起作用。 php.ini文件中是否有任何设置可以解决这个问题?

3 个答案:

答案 0 :(得分:5)

你的结论是错误的。您可以通过配置浏览器来证明从不发送Referer HTTP标头。

来自setcookie() manual page

  

设置好Cookie后,可以在下一页访问它们   使用$ _COOKIE或$ HTTP_COOKIE_VARS数组加载

简单来说,这意味着$_COOKIE包含页面收到的Cookie,而不是发送的


编辑:您无法让PHP自动将传出的Cookie附加到$_COOKIE,但没有任何东西阻止您自己执行此操作 - 超级全局不是只读的:

setcookie("TestCookie", $value);
$_COOKIE["TestCookie"] = $value;

答案 1 :(得分:0)

据我所知,在页面刷新后,cookie会变为活动状态。设置$_SERVER['HTTP_REFERER']无关紧要:

  

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

See Documentation here关于使用cookies。

答案 2 :(得分:0)

$ _ COOKIE在执行PHP脚本之前填充(使用用户已有的任何cookie)。当您致电setcookie()时,它不会自动更新$ _COOKIE全局变量。但是,在下一页加载时,它将正确填充。

当用户从服务器请求页面时,它会将该域的所有Cookie发送到服务器。然后,服务器将使用它来填充$ _COOKIE全局变量,然后执行您的脚本。

当您调用setcookie()函数时,会将响应标头添加回客户端(仅在整个页面执行完毕后发送)告诉它存储此新cookie。因此,当用户下次请求页面时,它会将此新cookie发送给您。

要在代码中“修复”此问题,您可以执行以下操作:

<?php
if (!isset($_COOKIE['my_cookie']))
{
    setcookie('my_cookie', 'value');
    $_COOKIE['my_cookie'] = 'value';
}

// do logic with $_COOKIE here
if (isset($_COOKIE['my_cookie']) && $_COOKIE['my_cookie'] = 'x')
{
    // do something
}
相关问题