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

通常、人々$rowは の結果として宣言します。mysql_fetch_row($result)ここで$result、SQL データベースにクエリを実行した後に得られるものです。ただし、ここのどこにも言及されていないので、コードが実際に機能するはずはないと思います。

編集:明らかにこれに対する例外は、これがファイル全体ではなく、この上のどこかで定義されている場合です。しかし、ええ、それ以外の場合は機能しないはずです。

于 2013-08-10T20:40:04.790 に答える