2010-08-13 62 views
0

我正在开发一个有趣的网站,我试图实现一个基于位运算符的目录访问控制。
我定义GUEST = 1, GROUP1 = 15 and GROUP2 = 23按位操作错误?

如果我比较

echo (23 & 1); // print 1 

,但如果我定义GUESTGROUP1GROUP2

define('GUEST', 1); 
define('GROUP1', 15); 
define('GROUP2', 23); 
// and then 
echo (GROUP2 & GUEST); // print 0 
echo USER_GUEST.','.USER_ROLES1.','.USER_ROLES2; // print 1,15,23` 

随着GROUP1没有问题:

echo (GROUP1 & GUEST); print 1. 

我哪里错了?一些建议? 谢谢。


我发现很奇怪的事情:我的客人,Group1和Group2是我通过一个函数parse_ini_file解析(个体经营:: $文件名,真实)的ini文件中声明;在一个班级内。 在我分析完文件后,我递归地定义了在[DEFINE](简单的技巧)下定义的夫妇key =值。 如果我在那里评论我的GROUP2 = 23定义,并在当前脚本中声明它(GROUP2 & GUEST),则返回1!

+1

我测试你的代码在PHP 4.4和5.2,并在这两个'回声(GROUP2&GUEST);''打印1' – webbiedave 2010-08-13 18:04:34

+0

'GROUP2&GUEST'也给我返回1。 – kiamlaluno 2010-08-13 18:46:18

回答

0

PHP 5.3:

php > define('GUEST', 1); 
php > define('GROUP1', 15); 
php > define('GROUP2', 23); 
php > echo GROUP2 & GUEST; 
1 
php > echo GROUP1 & GUEST; 
1 

PHP的版本是您使用?


Artefacto指出了一个可能的字符串问题(电子邮件:但似乎收回他的帖子,嗯)。同样是在5.3:

php > var_export(GUEST); 
1 
php > var_export(GROUP1); 
15 
php > var_export(GROUP2); 
23 
php > define('GUEST_AS_STRING', '1'); 
php > var_export(GUEST_AS_STRING); 
'1' 
php > echo GROUP1 & GUEST_AS_STRING; 
1 
php > echo GROUP2 & GUEST_AS_STRING; 
1 

“1”字49 49 & 15是1,但49 & 23是17.我不相信这是一个字符串的问题...

+0

我是谷歌搜索一些信息。测试服务器上安装的版本是PHP 5.2.9。此时我无法在不同版本上测试它 – cantabria 2010-08-13 18:12:37

1

确保你使用的基地2个号码为您的组,即1,2,34,8,16,32 ....或者你可以相互踩。以下是在位域中执行权限的正确方法。

define('GUEST', 1); 
define('GROUP1', 2); 
define('GROUP2', 4); 
$groups |= GUEST; 
$groups |= GROUP1; 
if($groups & GUEST) { 
    // This user is a guest (it is) 
} 
if($groups & GROUP1) { 
    // This user is in group 1 (it is) 
} 
if($groups & GROUP2) { 
    // This user is in group 2 (it is NOT) 
} 
+0

这完全不正确,'23&1!= 0'。这听起来像是从其他答案/评论中说,这是一个本地化的问题,但PHP正在为其他人返回正确答案('1') – 2010-08-13 18:10:59

+0

是的,我错过了他所说的话。 – 2010-08-13 18:29:04

0

已解决。
我完全php manual误解的声明中更新日志,他们说:现在

由数字构成

5.2.4按键和节名被评估为PHP整数因而由0开始编号,被评估为八进制和数字开始由0x被评估为十六进制。

这绝对清楚:键和部分名称...不值!
parse_ini_file()函数将整数值评估为PHP字符串,即使它们未用双引号引起来。这是遗憾,但事实如此;-)

感谢您的合作