1

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

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

如您所见,结果按预期显示每行的列。

4

2 回答 2

3

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

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

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

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

于 2013-08-10T20:39:16.177 回答
-1

通常人们会声明,查询 SQL 数据库后得到$row的结果是什么。但是,我没有看到这里提到的任何地方,所以我认为您的代码实际上不应该工作。mysql_fetch_row($result)$result

编辑:显然,如果这不是您的整个文件并且它是在此之上的某个地方定义的,则例外情况是。但是,是的,否则不应该工作。

于 2013-08-10T20:40:04.790 回答