MySQLi和while循环的麻烦

时间:2011-03-20 00:12:49

标签: php mysqli

我在这个类中有这个代码:

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

$ roleSQL的var_dump()是:

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

和$ pK:

Admin

直接在数据库中运行查询时,我得到一个包含8行的结果。 为什么循环不能识别多行。 如果我添加声明:

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

它转储第一行的数组,然后循环执行第二行。

我真的很困惑,

请帮忙

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

哈哈答案其实就在于循环之外。

调用此函数$this->getPermKeyFromID($row['permID'])实际上会覆盖数据库中的结果,因为它使用的是同一个数据库对象。我通过将结果存储在该循环的局部变量中来修复它。