2015-03-02 57 views
0

每次用戶登錄時,我都會提取包含權限的序列化數組。當我反序列化數組並嘗試將每個權限賦給常量時,不存在的常量返回TRUE。舉例來說,這裏是我的電話數據庫:不存在常量返回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/> 

當我贊同常數...

  • USERS_READ:1
  • USERS_UPDATE:1
  • USERS_CREATE:USERS_CREATE
  • USERS_DELETE:USERS_DELETE

所以一切都在這種情況下返回TRUE。

有什麼想法?

+0

這就是我在這裏所做的:define(strtoupper($ permission),1);不是? – 2015-03-02 16:16:06

+0

'error_reporting(E_ALL); ini_set('display_errors','1')' – AbraCadaver 2015-03-02 16:21:04

回答

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; 
} 

順便說一句,使用「動態常數」聽起來像是您可能想要重新思考的設計理念。常量通常是恆定的:)