我正在使用PHP in_array()函数,以便在用户可以访问特定页面时进行身份验证(使用会话)。出于某种原因,它不起作用......
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语句,我可以看到所有正确的值都被传递给函数。问题是,如果在没有设置会话变量的情况下调用函数,由于某种原因它被认为是在数组中,并且它进行了身份验证。
有什么想法吗?
答案 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
,这样保证类型检查以及值检查(===
与==
)。从数组中删除零也可能是一个好主意。