2016-12-14 80 views
0
class user{ 

protected $permissions; 

public function can($permission) 
    { 
     if (!isset($this->permissions)) { 
      /* 
      fetch permissions for this user from the database, and set the 
      User::permissions property, to allow caching. 
      */ 
      $cnx = $this->connexion(); 
      $stmt = $cnx->prepare('SELECT permissions.permission_name FROM permissions, users_permissions WHERE users_permissions.user_id = ? AND users_permissions.permission_id = permissions.permission_id'); 
      $stmt->bind_param('s', $_SESSION["user_id"]); 
      $stmt->execute(); 
      $result = $stmt->get_result(); 

      $people = array("Peter", "Joe", "Glenn", "Cleveland"); 
      var_dump($people); 
      $this->permissions= $result->fetch_all(MYSQLI_ASSOC);  

      var_dump($this->permissions);  
     } 

     return in_array($permission, $this->permissions); 
    } 
} 

(方案1)的陣列的結果如下所示:如何更改查詢的數組方案結果?

array (size=8) 
    0 => 
    array (size=1) 
     'permission_name' => string 'Peut créer une permission' (length=26) 
    1 => 
    array (size=1) 
     'permission_name' => string 'Peut modifier une permission' (length=28) 
    2 => 
    array (size=1) 
     'permission_name' => string 'Peut voir des comptes utilisateurs' (length=34) 

我試圖代替fetch_allfetch_array但它僅返回一行

(方案2)是反正有使該數組看起來像這一個,因爲如果這樣做,將工作:

array (size=4) 
    0 => string 'Peter' (length=5) 
    1 => string 'Joe' (length=3) 
    2 => string 'Glenn' (length=5) 

實例化用戶

$that_guy = new user(); 
if ($that_guy->can('Peut créer une permission')) { 
    echo"yay"; 
}else { 
    echo"you can't"; 
} 

是否有任何可能的方法來更改方案1的數組,使其看起來像方案2的數組?

+1

目前還不清楚其中實際問題!?什麼不按預期工作? – Jeff

+0

爲最後的代碼,我總是必須使用循環來獲取permission_name我想要的第一個代碼,因爲它是要轉換爲mysqli –

+0

爲什麼不過濾已經在你的SQL? – Jeff

回答

0

循環遍歷數組

public function can($permission) 
     { 
      if (!isset($this->permissions)) { 

       $cnx = $this->connexion(); 
       $stmt = $cnx->prepare('SELECT permissions.permission_name FROM permissions, users_permissions WHERE users_permissions.user_id = ? AND users_permissions.permission_id = permissions.permission_id'); 
       $stmt->bind_param('s', $_SESSION["user_id"]); 
       $stmt->execute(); 

       $result = $stmt->get_result(); 
       $stmt->bind_result($permission_name); 
       $stmt->store_result(); 


       $this->permissions = array(); 
       while(($row = $result->fetch_assoc())) { 
        $this->permissions[] = $row['permission_name']; 
       } 


      } 

      return in_array($permission, $this->permissions); 
     } 

結果會像你想要什麼(方案2)

+0

謝謝你,我已經試過您的解決方案,它的工作就像魅力循環通過它的伎倆 –

0

在PHP端你可以使用array_column

$this->permissions = array_column($this->permissions, 'permission_name'); 

而且,我會用另外array_flip

$this->permissions = array_flip(
    array_column($this->permissions, 'permission_name') 
); 

這樣,您就可以使用isset($this->permissions[$permission])而不是in_array($permission, $this->permissions);,因爲它是速度更快。

1

用的mysqli這是不可能的,這是一個很好的理由,爲什麼你應該使用PDO,而不是

$cnx = $this->connexion(); 
$stmt = $cnx->prepare('SELECT permissions.permission_name FROM permissions, users_permissions WHERE users_permissions.user_id = ? AND users_permissions.permission_id = permissions.permission_id'); 
$stmt->execute([$_SESSION["user_id"]]); 
$this->permissions = $stmt->fetchAll(PDO::FETCH_COLUMN); 

這就是全部。
不僅此代碼縮短了兩倍,而且它還爲您提供了所需的確切結果。