每次用户登录时,我都会提取包含权限的序列化数组。当我反序列化数组并尝试将每个权限分配给常量时,不存在的常量返回TRUE。例如,这是我对数据库的调用:
$req_level = $pdo->prepare('SELECT * FROM users_levels WHERE level_id = ?');
$req_level->execute(array($row['level_id']));
$row_level = $req_level->fetch();
$user_level_name = $row_level['name'];
$permissions = unserialize($row_level['permissions']);
foreach ($permissions as $permission) {
define(strtoupper($permission), 1);
}
$req_level->closeCursor();
我的数组($权限)是:
Array ( [0] => users_read [1] => users_update [2] => customers_read [3] => customers_update )
当我调用所有可能的常量时,对于那些现有的常量我应该为TRUE,对于那些不存在的常量应该为FALSE,但这是我得到的...
USERS_READ : <?=USERS_READ?> <br/>
USERS_UPDATE : <?=USERS_UPDATE?> <br/>
USERS_CREATE : <?=USERS_CREATE?> <br/>
USERS_DELETE : <?=USERS_DELETE?> <br/>
当我回显常数时......
所以在这种情况下一切都返回TRUE。
有什么想法吗?
答案 0 :(得分:3)
通常,在PHP中,未找到的常量将转换为具有相同名称的字符串。因此,尝试使用常量'USERS_READ'时,会尝试使用字符串'USERS_READ'。转换为布尔值时,字符串'USERS_READ'将为true。
因此,在尝试评估常量之前,您需要使用方法defined
来检查它是否存在:
http://php.net/manual/en/function.defined.php
或者,您可以这样做:
function userHasPermission( $permission ) {
return constant($permission) === 1;
}
顺便说一句,在旁注上,使用“动态常量”听起来像是一个设计理念,你可能想重新考虑一下。常数通常是常数:)