检查 PHP cookie 是否存在,如果没有设置其值


Check if a PHP cookie exists and if not set its value

我正在一个多语言网站上工作,所以我尝试了这种方法:

echo $_COOKIE["lg"];
if (!isset($_COOKIE["lg"]))
    setcookie("lg", "ro");
echo $_COOKIE["lg"];

这个想法是,如果客户端没有lg cookie(因此,这是他们第一次访问这个网站),那么为该用户设置一个cookie lg = ro

一切正常,除了如果我第一次进入此页面,第一个和第二个echo什么也没返回。只有当我刷新页面时,cookie 才会设置,然后两者都echo打印我期望的"ro"字符串。

如何设置此 Cookie 以便在用户首次访问/页面加载时从第二个echo中查看其值?应该不需要刷新页面或创建重定向。

答案

你不能根据PHP手册:

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

这是因为 cookie 以响应标头的形式发送到浏览器,然后浏览器必须将它们与下一个请求一起发送回去。这就是为什么它们仅在第二次页面加载时可用的原因。

解决方法

但是您可以通过在调用setcookie()时设置$_COOKIE来解决此问题:

if(!isset($_COOKIE['lg'])) {
    setcookie('lg', 'ro');
    $_COOKIE['lg'] = 'ro';
}
echo $_COOKIE['lg'];
Cookie 仅在

请求时发送,因此无法在分配后立即检索(仅在重新加载后可用)。

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

如果在调用此函数之前存在输出,setcookie() 将失败并返回 FALSE。如果 setcookie() 成功运行,它将返回 TRUE。这并不表示用户是否接受 Cookie

在下次加载 Cookie 应该可见的页面之前,Cookie 不会变得可见。要测试是否成功设置了 Cookie,请在 Cookie 过期之前在下一个加载页面上检查该 Cookie。过期时间通过过期参数设置。调试 cookie 存在的一个好方法是简单地调用 print_r($_COOKIE);。

如果你用php设置了一个cookie,setcookiecan see the set and the value cookie,例如,使用Firefox just in time developer tools

如果您想阅读、获取或检查 cookie 和 PHP 中的 to work with that cookie 中的值,But you need to reload/load相同/下一个page

通过此示例,您可以choose是否要reload具有PHPHTMLJAVASCRIPT的同一页面。

如果 Cookie 未被接受或禁用 Cookie,则会获取加载循环,浏览器将停止加载页面。

LONGVERSION WITH PHP 'header' RELOAD SAME PAGE

<?php
$COOKIE_SET     = [
     'expires'  => '0'
    ,'path'     => '/'
//  ,'domain'   => 'DOMAIN'
    ,'secure'   => 'true'
    ,'httponly' => 'true'
//  ,'samesite' => 'Strict'
    ];
    
$COOKIE_NAME    = "MYCOOKIE";
$COOKIE_VALUE   = "STACKOVERFLOW";
    
if(!isset($_COOKIE[$COOKIE_NAME])){
    setcookie($COOKIE_NAME, $COOKIE_VALUE, $COOKIE_SET);
    // YOU NEED TO RELOAD THE PAGE ONCE
    // WITH PHP, HTML, OR JAVASCRIPT
    // UNCOMMENT YOUR CHOICE
    
    // echo '<meta http-equiv="refresh" content="0;URL=/">';
    // echo '<script>window.location.replace("/");</script>';
    header("Location: /");
    exit;
  }
else{
    echo ($_COOKIE[$COOKIE_NAME]);
}
  
?> 

SHORTVERSION WITH PHP 'header' RELOAD SAME PAGE

if(!isset($_COOKIE['MYCOOKIE'])){
    setcookie('MYCOOKIE', 'STACKOVERFLOW');
    header("Location: /");
    exit;
}
echo ($_COOKIE['MYCOOKIE']);