2014-04-03 57 views
1

我正在研究以下我希望是一个简单的脚本。我使用Cisco AXL WSDL与思科CUPS服务器联系,运行SQL查询,循环查看结果,然后将其反馈到另一个步骤,以将返回的行更新为特定值。然而,当我回来的SOAP响应与单行(数组对象)和多行(数组内的数组)不同时,我遇到了一个挑战。PHP SOAP Array评估

下面是脚本现在,我只是想循环,并回应我越来越复杂之前得到的。

<?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我结束了两个不同的语句点:

对于一个项目是:

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

而对于多个项目,它是:

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

所以问题是,有没有办法让我在我的foreach循环中完成返回PKID值而不必提前评估数组?希望这是有道理的,自己承认网络工程师第一,幼稚的“开发者”第二。

回答

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,命令确保即使在单结果它的建成为一个数组不是一个对象。