当php中未接收到$_SERVER[“http_referer”]时,setCookie()函数不起作用


setCookie() function is not working when $_SERVER["http_referer"] is not received in php

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

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

从setcookie()手册页面:

一旦设置了cookie,就可以在下一页访问它们使用$_COOKIE或$HTTP_COOKIE_VARS数组加载

通俗地说,这意味着$_COOKIE包含页面接收的cookie,而不是发送的cookie。


编辑:您不能让PHP自动将传出cookie附加到$_COOKIE,但没有什么可以阻止您自己执行--超级全局变量不是只读的:

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

据我所知。。cookie在页面刷新后变为活动状态。是否设置了$_SERVER['HTTP_REFERER']并不重要:

一旦设置了COOKIE,就可以在下一页加载时使用$_COOKIE或$HTTP_COOKIE_VARS数组访问它们。注意,像$_COOKIE这样的超全局变量在PHP 4.1.0中已经可用。Cookie值也存在于$_REQUEST中。

有关Cookie的使用,请参阅此处的文档。

$_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
}