未设置 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 5.4 中的 PhP 上传进度不起作用。未设置会话变量