【问题标题】:strange issue when overwriting $_SESSION variable types覆盖 $_SESSION 变量类型时的奇怪问题
【发布时间】:2012-09-04 01:51:20
【问题描述】:

我已将问题的症结总结得尽可能简短:

一个简单的脚本:

<?php
session_start();

$_SESSION['user']="logged";

然后覆盖

$_SESSION['user']=0;  

并显示 $_SESSION 内容

var_dump($_SESSION);

显示 $_SESSION['user'] 为 '0' - 确定,因为它刚刚被覆盖

但是现在观看

if ($_SESSION['user']=="logged"){
    echo "logged";
}
else{
    echo "unlogged";
}

输出“记录”....

似乎变量类型的变化只是表面的 - 我不知道我做错了什么.. 我是否需要使用 === 比较来包括检查类型?

【问题讨论】:

    标签: php session overwrite


    【解决方案1】:

    没错,需要严格比较===

    这是因为 PHP 尝试将您的字符串转换为数字,因此“记录”传递为 0

    然后 0 == 0

    • (int)“记录”= 0
    • (int) "1logged" = 1
    • (int) "logged1" = 0

    http://www.php.net/manual/en/language.types.type-juggling.php

    【讨论】:

    • 或将数字放在引号之间。 $_SESSION['user'] = '0';
    【解决方案2】:

    这很正常,因为:

    (int)"logged" = 0
    

    所以0 = 0

    你需要做严格的比较

    if ($_SESSION['user'] === "logged")
    

    【讨论】:

    • Maks3w 和 Mihai,我是否理解正确,当尝试用 int Php 覆盖字符串值时,将 str 值转换为 int ((int) "logged" = 0)?正如我所理解的那样,它应该与变量而不是值有关......?我很困惑..
    • 它尝试将两个变量左右转换,right 已经是INT 并尝试将两者都转换为相同的类型。
    • 在我看来,最合乎逻辑的是 $my_array['key1']=1 应该覆盖之前在 $my_array['key1'] 上的任何字符串值,而不是从中创建变量字符串并将其转换为 int 1.. 需要考虑一下,谢谢回复!
    • 如果你做$my_array['key1']='1';,那么是的,它会用一个字符串覆盖,因为'1'是一个字符串......,但0是一个整数。
    • 好的,回到我最初的例子,$_SESSION 数组中的 str "logged" 变成了一个变量 $logged 在覆盖后转换为 int = 0?这可以解释为什么 $_SESSION['user']=="logged" 是 TRUE 但它让我很困惑,因为 str "logged" 应该在覆盖后被擦除/清除..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2022-06-16
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多