【问题标题】:Undefined index while checking for COOKIE in PHP在 PHP 中检查 COOKIE 时未定义的索引
【发布时间】:2022-02-15 19:03:19
【问题描述】:

我在访问者的 PC 上设置了一个 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')

有没有办法像我一样或以类似的方式一步完成这项检查?

谢谢

【问题讨论】:

    标签: php cookies


    【解决方案1】:

    源中的索引“通知”与错误消息中报告的索引“测试”不匹配。为避免引起注意,请在读取变量或索引之前对其进行验证。

    这里有两个用于验证的函数。

    isset()

    是否设置了变量/索引而不是 NULL

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

    您可以将 && (and) 用于第二个条件,它也必须为 TRUE。

    空()

    对索引/变量不存在或具有被视为空的值(NULL、0、''、array())进行否定检查。

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

    你可以使用 || (或)将其与也需要为 FALSE 的其他条件结合起来。

    或者使用运算符:

    ??

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

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

    【讨论】:

    • 通知实际上是由于这个变量..我只是在问题中写错了。您的答案将不起作用,因为如果设置了 cookie 但没有值“yes”怎么办?
    • 我把例子写得更具体一点。
    • 再次...第一个函数是肯定的,所以它是无关紧要的...它检查cookie是否具有值'yes'...关于第二个,如果cookie退出,有值怎么办,但值不等于'yes'
    • 哦...对不起...我认为 empty 与 !isset 相同,除了 !isset 仅用于空值...所以你是对的 :)
    【解决方案2】:

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

    代码应该是这样的:

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

    【讨论】:

    • 它不会像这样工作,因为您的代码正在检查 cookie 是否已设置...如果未设置,通知将不会显示...我正在检查 @987654324 @ 在收到此通知之前,该通知确保 cookie 是否已设置以及是否具有值“yes”
    • 如果您查找我的第二段代码,这实际上是我的答案:D 我想知道是否有更短的方法可以做到这一点?
    • 不一样,查一下。同样不,没有自定义函数是不可能让它变短的。
    • 这里是我的代码if((isset($_COOKIE['notice']) || !isset($_COOKIE['notice'])) && $_COOKIE['notice'] != 'yes') 除了我在!ISSET 之前提到ISSET 之外,这不一样吗?
    • 用英语(或类似的语言,我的主要语言不是英语):您正在评估以下内容。如果 cookie notice 存在,则显示通知(|| 是短路或),或者如果未设置 notice 并且未设置 cookie,则显示通知。这是错误的,因为如果您没有 cookie,那么您就没有并且拥有价值。您也会因此收到通知。
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    相关资源
    最近更新 更多