$ row定义在哪里?

时间:2013-08-10 20:37:30

标签: php mysql

在下面的代码中,有人能告诉我foreach语句中变量$ row的来源吗?

public function getProcResultSet($cmd)
    {
         try
        {
            $meta = $cmd->result_metadata();

            while ($field = $meta->fetch_field())
            {
                $params[] = &$row[$field->name];
            }

            call_user_func_array(array(
                $cmd,
                'bind_result'), $params);

            while ($cmd->fetch())
            {
                foreach ($row as $key => $val)
                {
                    $c[$key] = $val;
                }

                $results[] = $c;
            }

            return $results;
        }
        catch (Exception $e)
        {
            logToFile("Exception: " . $e);
            return resultFailedUnknown();
        }
}

编辑,这是此函数的调用者:

public static function getPlayerUnits($playerId, $unitTypeId)
    {
        $mysqli = new mysqli(GDB_HOST, GDB_USERNAME, GDB_PASSWORD, GDB_NAME);

        if ($mysqli->connect_errno)
        {
            throw new Exception('DB Connection Failed. Error Code: ' . $mysqli->connect_errno);
        }

        $cmd = $mysqli->prepare('CALL sp_get_player_units(?, ?)');

        if (!$cmd)
        {
            throw new Exception($mysqli->error);
        }

        $cmd->bind_param('ii', $playerId, $unitTypeId);
        $cmd->execute();

        $results = parent::getProcResultSet($cmd);

        $cmd->close();
        $mysqli->close();

        return $results;
    }

这是结果数组,我所做的就是在客户端和JSON.stringify(..)上接收:

[{"Id":1,"Name":"Machine Gunner","Quantity":0},{"Id":2,"Name":"Rocket Soldier","Quantity":0},{"Id":3,"Name":"Paratrooper","Quantity":0},{"Id":4,"Name":"Demolition Soldier","Quantity":0}]

如您所见,结果显示了每行的列数。

2 个答案:

答案 0 :(得分:3)

在第一个while循环中,由于引用运算符&。它之前不存在。

$params[] = &$row[$field->name]创建$row变量。会发生什么事情,PHP想要引用不存在的$row,所以它创建它没有任何消息(如果你问我,这是一个很好的bug源)。 $row创建为数组,其中键$field->name设置为空。

$row 确实存在于foreach循环中,但不存在于while循环中。在那里它被创建为具有空值的数组。

整个事情是相当混淆的代码,不是很可读。有时代码中的冗长是一件好事。

答案 1 :(得分:-1)

通常人们会将$row声明为mysql_fetch_row($result)的结果,其中$result是查询SQL数据库后获得的结果。但是,我没有在这里看到任何提到的内容,因此我认为您的代码实际上不会起作用。

编辑:很明显,如果这不是你的整个文件并且在上面的某个地方定义了它的例外情况。但是,不应该这样做。