未设置 PHP 会话 false

Posted

技术标签:

【中文标题】未设置 PHP 会话 false【英文标题】:PHP session false not set 【发布时间】:2015-01-14 21:58:09 【问题描述】:

给session设置false值时,设置了session,但值为空。类型是布尔值。 这段代码:

<?php
    session_start();
    $_SESSION["IsMobile1"] = false;
    $_SESSION["IsMobile2"] = true;
    //header("location: ../../../index.php");
    echo "IsSet1: " . isset($_SESSION["IsMobile1"]) . "; IsMobile1: " . $_SESSION["IsMobile1"] . "; type: " . gettype($_SESSION["IsMobile1"]) . ";<br>";
    echo "IsSet2: " . isset($_SESSION["IsMobile2"]) . "; IsMobile2: " . $_SESSION["IsMobile2"] . ";<br>";
?>

打印出来:

IsSet1: 1; IsMobile1: ; type: boolean;
IsSet2: 1; IsMobile2: 1;

我的 PHP 版本是 5.5.13。 这是预期的行为吗?我正在尝试使用代码阅读会话:

if (isset($_SESSION["IsMobile"]))
    
        if (is_bool($_SESSION["IsMobile"]))
        
            header("location: Mobile/");
            exit;
        
    

但它当然不起作用,因为 IsMobile 是空布尔值。 (原来我只使用 IsMobile。IsMobile1 和 IsMobile2 仅用于测试)。

【问题讨论】:

is_bool 告诉你你正在处理一个布尔值。它不检查该变量是真还是假。 U can't echo out false it's just nothing in PHP, as with null 是的。我的意思是 filter_var 不是 is_bool 和 filter_var('', FILTER_VALIDATE_BOOLEAN);返回 false 这是预期的行为。来自:***.com/questions/7336861/… btw isset() 如果数组索引存在并且设置了值,则返回 false,但该值为 null。或者,如果您只想检查密钥是否存在,您可以使用array_key_exists()。如果在某些情况下此代码可能在没有 $_SESSION 变量的情况下运行,您可以通过在调用 array_key_exists() 之前检查 isset($_SESSION) 将两者结合起来。 【参考方案1】:

我自己多次遇到这个问题,虽然仍未得到证实,但我得出了以下结论:

由于boolean 类型不能用作 1 或 0 的常量,因此它只是在打印或任何其他输出尝试时强制转换为 int。但它只发生在TRUE 上。 FALSE 总是(或至少在大多数情况下)保持为空(我从未见过 bool var 输出 FALSE)。

但好消息是,如果您在if 语句中使用定义为FALSE 的变量,它将被解释为FALSE(如预期的那样)。

那么,如果你想输出它们怎么办?

输出字符串:

if ($_SESSION["IsMobile"] == FALSE) 
    echo "FALSE";

更新哦,是的,这是我在文档中遗漏的内容:

布尔值 TRUE 转换为字符串“1”。布尔值 FALSE 是 转换为“”(空字符串)。这允许转换回来和 介于布尔值和字符串值之间。

The source

【讨论】:

不是代码错了,只是想指出它实际上并没有检查会话变量是否设置为false,而是检查它是否是假的,因为只有==被用来代替===。我想知道 PHP 会话是否甚至能够在整个会话中将数据保持为 bool 类型,或者是否在某些时候它会被转换为字符串。【参考方案2】:

怎么样:

if (!empty($_SESSION["IsMobile"]))

  header("location: Mobile/");
  exit;

【讨论】:

【参考方案3】:

尝试使用严格的操作符

$_SESSION['IsMobile'] === TRUE

【讨论】:

以上是关于未设置 PHP 会话 false的主要内容,如果未能解决你的问题,请参考以下文章

未设置时的php会话变量问题

PHP 会话未设置

PhP 5.4 中的 PhP 上传进度不起作用。未设置会话变量

php artisan route:list RuntimeException 会话存储未按请求设置

PHP 会话数据未保存

未设置会话变量会停止执行