PHP in_array不起作用

时间:2009-07-01 16:05:10

标签: php arrays session

我正在使用PHP in_array()函数,以便在用户可以访问特定页面时进行身份验证(使用会话)。出于某种原因,它不起作用......

PHP PAGE

session_start();
require_once('../scripts/functions.php'); 
$role_auth = @$_SESSION['role_auth'];
access($role_auth, array(0,1,2,3,4));

访问功能

function access($role_auth, $array){

if(!(in_array($role_auth, $array))){ 
   header("Location: ../index.html");
}
}

如果我在函数中插入print语句,我可以看到所有正确的值都被传递给函数。问题是,如果在没有设置会话变量的情况下调用函数,由于某种原因它被认为是在数组中,并且它进行了身份验证。

有什么想法吗?

4 个答案:

答案 0 :(得分:9)

您可能希望使用以下命令启用严格类型检查:

in_array($role_auth, $array, true)

因为可能发生的事情是$ role_auth被eval'd为false并且在你的in_array语句中可以匹配0。

你应该做的是:

session_start(); 
require_once('../scripts/functions.php'); 
$role_auth = (isset($_SESSION['role_auth']))?$_SESSION['role_auth']:-1; 
access($role_auth, array(0,1,2,3,4));

或类似的东西。使用@运算符

没有任何好处

答案 1 :(得分:3)

我会检查$ _SESSION ['role_auth']是否实际设置(使用isset)而不是使用@来禁止警告(这是不好的做法恕我直言)

我认为发生的事情是false == 0 ...所以in_array在$ role_auth中没有任何内容时返回true,因为它将其视为0并且0在您的数组中

答案 2 :(得分:3)

 $role_auth = @$_SESSION['role_auth'];

@符号会抑制您可能会遇到的任何警告,例如索引不在数组中。这样的事情怎么样呢:

 if(isset($_SESSION['role_auth']))
    $role_auth = $_SESSION['role_auth'];
 else
    $role_auth = -1;//(or whatever an invalid role is)

答案 3 :(得分:3)

在php中,数字零被认为等于大多数非数字事物,例如:

null   == 0
false  == 0
""     == 0
"asdf" == 0

您可能需要事先确保$_SESSION实际包含'role_auth'密钥并将其转换为适当的类型,同时将$strict参数传递给in_array,这样保证类型检查以及值检查(=====)。从数组中删除零也可能是一个好主意。