2011-03-20 115 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