1

我已经阅读了关于 in_array 的所有其他文章,但仍然不明白为什么我的结果很奇怪。我从其他人那里继承了这段代码,并且不完全理解他们为什么做某些事情。当用户登录时,从数据库中获取数据,其中一个字段是他们的“级别”。1 是管理员,2 是普通用户,以此类推。从数据库中获取数据后,我们将用户级别(存储为 a:1:{i:0;s:1:"2") 放入数组中:

$user_level = unserialize($this->result['user_level']); 
$_SESSION['unt']['user_level'] = $user_level;

稍后我们检查这是否是管理员:

error_log(print_r($_SESSION['abc']['user_level']));  //this is always "1"
if (in_array('1', $_SESSION['abc']['user_level'])) {   //should be yes, correct?

然而不知何故,即使 SESSION 变量为 1,if 语句也永远不会评估为真。我错过了什么?

4

2 回答 2

2

$_SESSION['abc']['user_level']似乎不是一个数组。看起来你想要以下之一。

如果 gettype($_SESSION['abc']['user_level']) 是“整数”:

if ($_SESSION['abc']['user_level']) === 1) {

如果 gettype($_SESSION['abc']['user_level']) 是'字符串':

if ($_SESSION['abc']['user_level']) === '1') {

如果 gettype($_SESSION['abc']['user_level']) 是 'string' 并且它的值实际上包含引号:

if ($_SESSION['abc']['user_level']) === '"1"') {

如果它是一个数组,则输出将具有这种结构,而不仅仅是“1”:

Array
(
    [0] => 1
)
于 2013-10-14T23:57:31.653 回答
0

即使我注意到}您的输入字符串中缺少右括号,我只是假设您可能在复制粘贴时可能错过了。

a:1:{i:0;s:1:"2"

所以in_array不是问题,但您的输入字符串是问题。
通过display_errors设置Off,您在尝试时不会看到任何错误unserialize

您可以使用以下函数来检查输入是否是要反序列化的有效字符串:

//  Copied from http://www.php.net/manual/en/function.unserialize.php
function is_serialized( $str )
{
    return( $str == serialize( false ) || @unserialize( $str ) !== false );
}

然后沿着这些思路:

    $inputString = 'a:1:{i:0;s:1:"2";}';   //  Is valid and is holding one array of info
//  $inputString = 'a:1:{i:0;s:1:"2"';   //  Invalid as is missing a closing baracket }

if( ! is_serialized( $inputString ) )
{
    echo 'Is not serialized';
}
else
{
    $user_level = unserialize( $inputString );

    $_SESSION['unt']['user_level'] = $user_level;   //  Is an array

//  Note the second argument as was already pointed by @AsksAnyway
    error_log( print_r( $_SESSION['unt']['user_level'] , true ) );

    var_dump( in_array( '1' ,$_SESSION['unt']['user_level']) );

    var_dump( in_array( '2' ,$_SESSION['unt']['user_level']) );
}
于 2013-10-15T02:10:38.170 回答