检查PHP cookie是否存在,如果不存在则设置其值。

48
我正在处理一个多语言网站,所以我尝试了这种方法:

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

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

这个想法是,如果客户端没有 lg cookie(也就是他们第一次访问该网站),则为该用户设置一个 lg = ro 的cookie。

一切都很正常,除了当我第一次进入这个页面时,第一个和第二个 echo 没有返回任何内容。只有当我刷新页面后才会设置cookie,然后两个 echo 才打印出我期望的“ro”字符串。

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


我会将客户端cookie(即$_COOKIE[]数组)的需求与服务器端会话cookie(即$_SESSION[]数组)分开。对于代码中的进一步内部使用,请使用$_SESSION cookie - 在设置后可以立即访问。 - Hristo
3个回答

109

答案

根据PHP手册,你无法立即访问新设置的cookie:

一旦cookie被设置,就可以通过$_COOKIE或$HTTP_COOKIE_VARS数组在下一页中访问它们。

这是因为cookie是作为响应标头发送到浏览器的,浏览器必须用下一个请求将其发送回来。 这就是为什么它们只在第二个页面加载时可用。

解决方法

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

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

2
我个人建议不要设置 $_COOKIE[] 的值。这可能会欺骗后续的某些代码,让其认为用户确实拥有此 cookie。替代方案是 $lg = (isset($_COOKIE['lg']) ? $_COOKIE['lg'] : 'ro'; echo $lg; - Ramy Nasr
嗨,Ramy,希望你一切顺利。我知道这段代码是5年前的了,但你能更清楚地解释一下吗?我也遇到了无效语法的问题... - DOMDocumentVideoSource

17

Cookie(小甜饼)仅在请求时发送,因此无法在分配后检索(只能在重新加载后可用)。

一旦设置了Cookie,它们就可以通过$_COOKIE或$HTTP_COOKIE_VARS数组在下一个页面加载时访问。

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

Cookies直到下次加载需要显示Cookie的页面才会变为可见。要测试是否成功设置了Cookie,请在Cookie过期之前的下一个加载页面上检查Cookie。到期时间通过expire参数设置。调试Cookie存在的一种好方法是简单地调用print_r($_COOKIE);。

来源


0
如果使用php的setcookie函数设置一个cookie,你可以通过火狐浏览器的开发者工具即时查看cookie的设置和值。但是,如果你想在PHP中读取、获取或检查cookie及其中的值并与该cookie一起使用,需要重新加载/载入相同/下一页。
通过这个例子,你可以选择使用PHP、HTML或JavaScript重新加载相同的页面。
如果cookie没有被接受或禁用了cookie,则会获得一个加载循环,并且浏览器停止加载页面。
带有PHP“头部”重新加载相同页面的LONGVERSION
<?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]);
}
  
?> 

使用 PHP 'header' 刷新同一页的简短版本:

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

echo ($_COOKIE['MYCOOKIE']);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接