数组中的PHP不工作
我使用PHP in_array()函数来验证(会话)用户是否可以访问特定页面。由于某种原因,它不起作用 PHP页面 访问功能 如果我在函数中插入print语句,我可以看到所有正确的值都被传递到函数中。问题是,如果在没有会话变量集的情况下调用函数,出于某种原因,它会被视为在数组中,并进行身份验证数组中的PHP不工作,php,arrays,session,Php,Arrays,Session,我使用PHP in_array()函数来验证(会话)用户是否可以访问特定页面。由于某种原因,它不起作用 PHP页面 访问功能 如果我在函数中插入print语句,我可以看到所有正确的值都被传递到函数中。问题是,如果在没有会话变量集的情况下调用函数,出于某种原因,它会被视为在数组中,并进行身份验证 有什么想法吗 我会检查$\u SESSION['role\u auth']是否已实际设置(使用isset),而不是使用@来抑制警告(这是错误的做法IMHO) 我想现在发生的是false==0。。。因此,当
有什么想法吗 我会检查$\u SESSION['role\u auth']是否已实际设置(使用
isset
),而不是使用@来抑制警告(这是错误的做法IMHO)
我想现在发生的是false==0。。。因此,当$role\u auth中没有任何内容时,数组中的将返回true,因为它将其视为0,并且0在数组中
$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)
您可能希望通过以下方式启用严格的类型检查:
in_array($role_auth, $array, true)
由于可能发生的情况是$role_auth被评估为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));
或者类似的东西。在php中使用@operator从来没有什么好处,零被认为与大多数非数字的东西相等,例如:
null == 0
false == 0
"" == 0
"asdf" == 0
您可能需要事先确保$\u SESSION
实际上包含'role\u auth'
键,并将其转换为适当的类型,同时将$strict
参数传递给数组中的,从而保证类型检查和值检查(==
vs.=
)。从数组中删除零也可能是一个好主意。只是一个提示,您可以使用范围(0,4)
而不是数组(0,1,2,3,4)
。关于安全检查的简要说明。确保在发送标题后调用die()或exit(),因为脚本中随后的内容仍将被发送。当php在后台打开或关闭错误报告时,@在性能方面也相当昂贵。这让我感到惊讶!,0==“asdf”OMFG!!:@天哪!!,自创建以来,此行为影响了我的整个web应用程序!(股票和序列码相关),现在我修补了这个,并进行了一致性检查。。。(一切正常!)说真的,我将提名诺亚·梅德林为年度风云人物=P
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));
null == 0
false == 0
"" == 0
"asdf" == 0