在 PHP 中检查 COOKIE 时出现未定义索引错误

6

我在访客的电脑上设置了一个cookie,每24小时显示一次通知。最近,在我的错误日志中出现了以下错误:

PHP: undefined index notice in **

我使用以下代码来检查是否存在具有值的cookie,如果不存在则显示通知:
if($_COOKIE['notice'] != 'yes')  
   echo 'notice';
}

我可以使用以下代码来避免PHP提示:

if((isset($_COOKIE['notice']) || !isset($_COOKIE['notice'])) && $_COOKIE['notice'] != 'yes')

有没有一种类似我之前做的那样只需一步就能完成此检查或类似方式的方法?

谢谢

2个回答

18

您源代码中的索引“notice”与错误消息中报告的索引“test”不匹配。为避免通知,您在读取变量或索引之前验证它。

这里有两个验证函数。

isset()

是一个正向检查变量/索引是否设置且不为NULL

if (isset($_COOKIE['notice']) && $_COOKIE['notice'] === 'yes') {
  // success
  echo 'Cookie equals "yes".';
}

您可以使用&&(和)来进行第二个条件的判断,这个条件也必须为TRUE。

empty()

是一个负面检查,用于检查索引/变量是否不存在或其值为空(NULL、0、''、array())

if (empty($_COOKIE['notice']) || $_COOKIE['notice'] !== 'yes') {
   // error
  echo 'Cookie does not exists, is empty or does not equal "yes".';
}

您可以使用 ||(或)将其与需要为FALSE的其他条件组合。

或者使用运算符:

??

如果变量/索引未设置或为空,则该运算符分配默认值:

$noticeCookie = (string)($_COOKIE['notice'] ?? 'no');
if ($noticeCookie === 'yes') {
  // success
  echo 'Cookie equals "yes".';

}

通知实际上是由这个变量引起的...我在问题中写错了。你的答案不会起作用,因为如果cookie被设置但没有值“yes”怎么办? - Michael Samuel
我把这些例子具体化了一点。 - ThW
再说一遍...第一个函数是正面的,所以它是无关紧要的...它检查 cookie 是否具有值“yes”...至于第二个函数,如果 cookie 存在,具有值,但该值不等于“yes”,那怎么办? - Michael Samuel
哦...抱歉...我以为空值和!isset是一样的,只有对于null值才是!isset...所以你是正确的 :) - Michael Samuel

1

在尝试查找变量内部内容之前,您始终需要知道变量是否已设置,因此是的...您需要进行检查。此外,您的逻辑是错误的...您正在检查notice是否已设置(始终为真),并检查notice是否为“yes”。

代码应该像这样:

if ( (!isset($_COOKIE['notice'])) || ( (isset($_COOKIE['notice'])) && ($_COOKIE['notice'] != 'yes') ) ) {
  //Show the notice
}

这样做不起作用,因为您的代码正在检查cookie是否已设置...如果没有设置,通知将不会显示...在获取此通知之前,我正在检查$_COOKIE['notice'] != 'yes',以确保cookie是否已设置,以及它是否具有值“yes”。 - Michael Samuel
这实际上是我的答案,如果你寻找我的第二段代码的话:D 我想知道是否有更短的方法来完成它? - Michael Samuel
不一样,检查一下。而且,如果没有自定义函数,就不可能使它变短。 - Babblo
明白了...你的逻辑更正确,虽然两种方法都给我相同的结果。 - Michael Samuel
但是这个 !isset($_COOKIE['notice']) || $_COOKIE['notice'] != 'yes' 怎么样?它将检查 cookie 是否不存在或者是否不等于 'yes'(这意味着它存在,但不等于 'yes')。 - Michael Samuel
显示剩余2条评论

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