1

in_array に関する他のすべての記事を読みましたが、奇妙な結果が得られる理由がまだわかりません。私はこのコードを他の誰かから継承していますが、彼らが特定のことをした理由を完全には理解していません。ユーザーがログインすると、データベースからデータが取得されます。フィールドの 1 つは「レベル」です。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 ステートメントが true として評価されません。何が欠けていますか?

4

2 に答える 2

0

入力文字列に閉じ括弧}が欠落していることに気付きましたが、コピーと貼り付け中におそらく欠落した可能性があると思いました。

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

問題in_arrayはありませんが、入力文字列が問題です。設定する
と、実行しようとしてもエラーは表示されません。display_errorsOffunserialize

以下の関数を使用して、入力がシリアル化を解除する有効な文字列であるかどうかを確認できます。

//  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 に答える