2010-08-13 29 views
0

Je développe un site pour le plaisir et j'essaye d'implémenter un contrôle d'accès d'annuaire basé sur des opérateurs de bit.
J'ai défini GUEST = 1, GROUP1 = 15 and GROUP2 = 23Erreur d'opération au niveau du bit?

Si je compare

echo (23 & 1); // print 1 

mais si je définis GUEST, GROUP1 et GROUP2:

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` 

Avec GROUP1 aucun problème:

echo (GROUP1 & GUEST); print 1. 

Où est-ce que je me trompe? une suggestion? Merci.


J'ai découvert quelque chose de vraiment étrange: mon invité, GROUPE1 et GROUPE2 sont déclarés dans un fichier ini que je parse par une fonction parse_ini_file (self :: fileName $, true); dans une classe. Après avoir analysé le fichier, je définis de façon récursive les couples clé = valeur définie dans la section [DEFINE] (une astuce simple). Si je commente ma définition GROUP2 = 23 et que je la déclare dans le script courant (GROUP2 & GUEST) return 1!

+1

J'ai testé votre code en PHP 4.4 et 5.2 et dans les deux'echo (GROUPE2 & GUEST); 'imprime '1 – webbiedave

+0

'GROUP2 & GUEST' me renvoie aussi 1. – kiamlaluno

Répondre

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 

Quelle est la version PHP utilisez-vous?


Artefacto a souligné un problème de chaîne possible (e mais semble avoir rétracté son poste, hm). Encore une fois dans 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' est le caractère 49. 49 & 15 est 1, mais 49 & 23 est 17. Je ne suis pas convaincu que cela est un problème de chaîne ...

+0

J'étais sur Google pour trouver des informations. La version installée sur le serveur de test est la version 5.2.9 de PHP. En ce moment je ne peux pas le tester sur une version différente – cantabria

1

Assurez-vous d'utiliser la base 2 numéros pour vos groupes, soit 1,2,34,8,16,32 .... ou vous pouvez vous chevaucher. Voici la bonne façon de faire des permissions dans un champ de bits.

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

C'est complètement faux, '23 & 1! = 0'. Il semble que d'après les autres réponses/commentaires que c'était un problème localisé, PHP renvoie la bonne réponse ('1') pour tout le monde –

+0

Oui, j'ai raté ce qu'il disait. –

0

Résolu.
J'ai complètement mal compris une déclaration php manual où, en Changelog ils disent:

5.2.4 Touches et noms section comprenant des numéros sont maintenant évalués sous forme d'entiers PHP nombres ainsi à partir de 0 sont évalués comme octal et les numéros commençant par 0x sont évalués en tant que hexadécimaux.

Il est absolument clair: touches et nom de section ... pas de valeurs!
La fonction parse_ini_file() évalue les valeurs entières comme une chaîne PHP même si elles ne sont pas entre guillemets. C'est dommage, mais il est donc ;-)

Merci pour votre collaboration