2011-03-20 102 views
1

我在一個類中這裏有這樣的代碼:麻煩與庫MySQLi和while循環

function getRolePerms($role) 
    { 
     if (is_array($role)) 
     { 
      $roleSQL = "SELECT * FROM `role_perms` WHERE `roleID` IN (" . implode(",",$role) . ") ORDER BY `ID` ASC"; 
     } else { 
      $roleSQL = "SELECT * FROM `role_perms` WHERE `roleID` = " . floatval($role) . " ORDER BY `ID` ASC"; 
     } 
     var_dump($roleSQL); 
     $this->database->dbquery($roleSQL); 
     $perms = array(); 
     while($row = $this->database->result->fetch_assoc()) 
     { 
      $pK = strtolower($this->getPermKeyFromID($row['permID'])); 
      var_dump($pK); 
      if ($pK == '') { continue; } 
      if ($row['value'] === '1') { 
       $hP = true; 
      } else { 
       $hP = false; 
      } 
      $perms[$pK] = array('perm' => $pK,'inheritted' => true,'value' => $hP,'Name' => $this->getPermNameFromID($row['permID']),'ID' => $row['permID']); 
     } 
     return $perms; 
    } 

後續代碼var_dump()爲$ roleSQL是:

SELECT * FROM role_perms WHERE roleID = 1 ORDER BY ID ASC 

和$克魯格曼:

Admin 

在數據庫中直接運行查詢時,我得到一個8行的結果。 爲什麼循環無法識別多行。 另外,如果我添加語句:

var_dump($this->database->result->fetch_assoc()); 

它丟棄第一排的陣列,然後循環就在第二排。

我真的百思不得其解,

請幫

回答

0

洛爾答案實際上是在循環之外。

調用此函數$this->getPermKeyFromID($row['permID'])實際上覆蓋了來自數據庫的結果,因爲它使用的是相同的數據庫對象。我通過將結果存儲在該循環的一個單獨變量中來修復它。

0

罪魁禍首是這條線的位置:

$perms[$pK] = array('perm' => $pK,'inheritted' => true,'value' => $hP,'Name' => $this->getPermNameFromID($row['permID']),'ID' => $row['permID']); 

發生什麼事是你所期望的8行導致$pK == 'Admin'。當您執行$perms[$pK] = array(...)時,8次循環迭代中的每一次都會寫入相同的數組鍵。最後,數組中只有一個值。

如果將其更改爲

$perms[] = array(...); 

應該按預期工作,因爲每次迭代將增加一個新的數組元素具有獨特的整數鍵。

旁註:

避免這樣做:

$roleSQL = "SELECT * FROM `role_perms` WHERE `roleID` = " . floatval($role) ... 

由於roleID肯定是一個整數,使用的是合適的工具:intval($role)

+0

$ pK的每個值都會不同。另外,循環中有var_dump(),理論上應該執行8次,但事實並非如此。 – FraserK 2011-03-20 00:19:47

+0

@FraserK:然後顯然這個錯誤是'$ this-> database-> result'所做的事情,你不給。 – Jon 2011-03-20 00:21:35

+0

'$ this-> database-> result'是一個mysqli對象。就像我上面所說的,我可以調用'var_dump($ this-> database-> result-> fetch_assoc());'8次,它會轉儲8行。但循環不會像它應該工作,我知道循環應該工作,因爲此代碼'while($ row = $ database-> result-> fetch_assoc())print_r($ row); '在另一頁上完美地工作。 :) – FraserK 2011-03-20 00:37:20