1

私は次のことに取り組んでいます。単純なスクリプトになることを願っています。Cisco AXL WSDL を使用して Cisco CUPS サーバーにアクセスし、SQL クエリを実行して結果をループし、それを別のステップにフィードバックして、返された行を特定の値に更新します。ただし、返される SOAP 応答が、単一の行 (配列オブジェクト) と複数の行 (配列内の配列) のどちらであるかと異なる場合、私は問題を抱えています。

これが現在のスクリプトです。より複雑になる前に、取得したものをループしてエコーアウトしようとしています。

<?php
    $client = new SoapClient("/var/www/AXLAPI.wsdl",
    array('trace'=>true,
    'exceptions'=>true,
    'location'=>"https://cups-test:8443/axl",
    'login'=>'admin',
    'password'=>'password',
    ));
    $response = $client->executeSQLQuery(array("sql"=>"select pkid from epasenduser where enablemoc = 't'"));
    //         var_dump($response);
    foreach ($response as $row){
    //              var_dump($row->row);
    echo("PKID: ".$row->pkid)."<br>";
    }
?>

実際の SOAP 応答が何であるかを示すことから始めましょう: 単一行の場合、次のようになります。

object(stdClass)#2 (1) {
["return"]=>
    object(stdClass)#3 (1) {
    ["row"]=>`
        object(stdClass)#4 (1) {
        ["pkid"]=>
        string(36) "9dbd9b32-8d64-41ad-a355-8f62e050ffce"
        }
    }
}

複数行の場合:

object(stdClass)#2 (1) {
["return"]=>
    object(stdClass)#3 (1) {
    ["row"]=>
    array(2) {
    [0]=>
    object(stdClass)#4 (1) {
    ["pkid"]=>
    string(36) "fa0540f7-8e75-481b-a193-7a06d7f601a8"
    }
    [1]=>
    object(stdClass)#5 (1) {
    ["pkid"]=>
    string(36) "fa0c8c7a-79be-4667-ae70-c3e773908b52"
    }
    }
    }
}

ここでの課題は、オブジェクトが SOAP 応答で複数回返されるためです。PHP は、それを見るたびに増加する整数値を割り当てていると推測しています。したがって、PKID を参照できるところまで到達したい場合は、次の 2 つの異なるステートメントになります。

単一のアイテムの場合は次のとおりです。

foreach ($response->return as $row){
    var_dump($row->pkid);
}

複数のアイテムの場合は次のとおりです。

foreach ($response->return->row as $row){
    var_dump($row->pkid);
}

問題は、事前に配列を評価せずに foreach ループで PKID 値だけを返す方法があるかどうかです。うまくいけば、これは理にかなっています。自称ネットワーク エンジニアが最初で、幼稚な「開発者」が 2 番目です。

4

1 に答える 1

2

最終的には、php をあまりスマートにせず、常に配列を取得できるようにする必要があります。

ここに素晴らしい記事を書いてください: http://blog.jasonrichardsmith.org/programming/soap-and-single-element-arrays/

要するに、接続設定を変更することでした:

        $client = new SoapClient("/var/www/AXLAPI.wsdl",
            array('trace'=>true,
           'exceptions'=>true,
           'features'=>SOAP_SINGLE_ELEMENT_ARRAYS,
           'location'=>"https://cups-test:8443/axl",
           'login'=>'admin',
           'password'=>'password',
        ));

コマンドを含めると、'features'=>SOAP_SINGLE_ELEMENT_ARRAYS,単一の結果であっても、オブジェクトではなく配列として構築されます。

于 2014-04-03T18:29:21.830 に答える