0

我试图在 PHP 函数中返回一个关联数组。该函数从 MySQL 中检索一些数据,并使用 Zend Library 发布在 WebService 中。

这个函数看起来像:

函数.php

class Functions  
{
    /** 
    *
    * @return array 
    */  
    public function Function1()  
    {

        $con = new mysqli(server, user, pass, database);

        if ($con->connect_errno) {
            die(__FUNCTION__ . $con->connect_error);
        }


        $con->set_charset('utf8');
        $arrayRet = array();

        $query = 'select field1, field2, field3 from table1';

        if(!$result = $con->query($query)){
            die(__FUNCTION__ . $con->error);
        }

        while( $row = $result->fetch_array(MYSQLI_ASSOC) )
            $arrayRet[] = $row;

        $result->close();
        $con->close(); 

        return $arrayRet;

    }
}

然后我有另一个 PHP 文件,它允许我通过 SOAP 访问该函数(使用 Zend Lib):

服务器.php

<?php
  include 'Zend/Soap/AutoDiscover.php';  
  include 'Zend/Soap/Server.php';  
  include 'Functions.php';  

  if(isset($_GET['wsdl']))   
  {  
     $autodiscover = new Zend_Soap_AutoDiscover();  
     $autodiscover->setClass('Functions');  
     $autodiscover->handle();  
  }   
  else   
  {  
     $server = new Zend_Soap_Server("http://localhost/webservice/Server.php?wsdl");  
     $server->setClass('Functions');  
     $server->handle();  
  }  
?>

到目前为止,一切看起来都很正常。如果我编写一个 php 客户端,我可以使用 web 服务并访问返回的数组,如下所示:

<?php

$client = new Zend_Soap_Client('http://localhost/webservice/Server.php?wsdl');
$arrayRet = $client->Function1();

foreach($arrayRet as $row )  
{  
 ?>
    <b>Field1: </b><?php echo $row['field1']; ?><br>
    <b>Field2: </b><?php echo $row['field2']; ?><br>
    <b>Field3: </b><?php echo $row['field3']; ?><br>
<?php  
  }  
?>

好的,现在我的问题是我不是在写一个 php 客户端,而是一个 Android 客户端。我正在使用 ksoap2 库来实现它。有了这个库,我可以按照这个算法处理带有键和值的“普通数组” 。使用他的属性:

    SoapObject category_list = (SoapObject) property;
    String key = category_list.getProperty("key").toString();
    String value = category_list.getProperty("value").toString();

但是上面函数的响应(如果我复制 toString() 结果)看起来像:

Function1Response
{
  return=
  [
   Map{
    item=anyType{key=field1; value=hello; }; 
    item=anyType{key=field2; value=web; }; 
    item=anyType{key=field3; value=service; };}, 

   Map{
    item=anyType{key=field1; value=hello2; }; 
    item=anyType{key=field2; value=web2; }; 
    item=anyType{key=field3; value=service2; };}, 

   Map{
    item=anyType{key=field1; value=hello3; }; 
    item=anyType{key=field2; value=web3; }; 
    item=anyType{key=field3; value=service3; };}
   ]; 
  }

我可以使用 key 和 value 属性来迭代这个响应,但我认为如果我能有这样的响应会更好(和高效):

Function1Response
{
  return=
  [
   Map{
    item=anyType{field1=hello; }; 
    item=anyType{field2=web; }; 
    item=anyType{field3=service; };}, 

   Map{
    item=anyType{field1=hello2; }; 
    item=anyType{field2=web2; }; 
    item=anyTypefield3=service2; };}, 

   Map{
    item=anyType{field1=hello3; }; 
    item=anyType{field2=web3; }; 
    item=anyType{field3=service3; };}
   ]; 
  }

所以我可以像这样检索它们:

    SoapObject category_list = (SoapObject) property;
    String field1 = category_list.getProperty("field1").toString();
    String field2 = category_list.getProperty("field2").toString();
    String field3 = category_list.getProperty("field3").toString();

那可能吗?我认为它可以在 php 服务器端以某种方式完成。但我不知道。我一直在这里和那里阅读,但似乎没有人有这个问题..或解决方案。

我很抱歉发了这么长的帖子。如果我不够清楚,我可以提供更多代码细节或更好地解释它。

感谢您的帮助!

4

1 回答 1

2

好吧,我确实找到了解决方案。

PHP 服务器中将在 web 服务中发布结果的函数如下所示:

class Functions  
{
    /** 
    *
    * @return array 
    */  
    public function Function1()  
    { 

        $con = new mysqli(server, user, pass, database);

        if ($con->connect_errno) {
            die(__FUNCTION__ . $con->connect_error);
        }


        $con->set_charset('utf8');
        $arrayRet = array();

        $query = 'select field1, field2, field3 from table1';

        if(!$result = $con->query($query)){
            die(__FUNCTION__ . $con->error);
        }

        while( $row = $result->fetch_array(MYSQLI_ASSOC) ){
            $myClass = new TestClass();
            $myClass->field1 = $row["field1"];
            $myClass->field2 = $row["field2"];
            $myClass->field3 = $row["field3"]; 
            array_push($arrayRet, $myClass);
        }


        $result->close();
        $con->close(); 

        return $arrayRet;

    }
}

我之前创建了一个具有所有相关属性的类,如下所示:

测试类.php

<?php
class TestClass 
{
    /**
    * @var string 
    */
    public $field1;

    /**
    * @var string 
    */
    public $field2;

    /**
    * @var string 
    */
    public $field3;

}

?>

所以基本上我们返回一个数组,其中包含该类的所有不同实例作为项目。

现在,在 Android 客户端(始终使用 ksoap2 库)中,我收到如下响应:

Function1Response
{
  return=
  [
    Struct{field1=hello; field2=web; field3=service;  },
    Struct{field1=hello2; field2=web2; field3=service2; }, 
    Struct{field1=hello3; field2=web3; field3=service3;}
  ]; 
}

我能够迭代它:

        //call
        androidHttpTransport.call(SOAP_ACTION, envelope);

        //envelope response
        SoapObject result = (SoapObject) envelope.bodyIn;

        //retrieve the first property, actually the array
                Vector result3 = (Vector) result.getProperty(0);

        //iterate
        Enumeration e=result3.elements(); e.hasMoreElements();)
        {
            //each object from the array its an Soap Element that contanins the properties defined in the php class
            SoapObject item=((SoapObject)e.nextElement());

            String field1 = item.getProperty("field1").toString();
            String field2 = item.getProperty("field2").toString();
            String field3 = item.getProperty("field3").toString();

            stringBuilder.append(
                    "Field1: " + codi + "\n"+ 
                    "Field2: "+ titol +"\n"+ 
                    "Field3: "+ descr +"\n"+
                    "******************************\n");
        }

就是这样......我希望它对其他人有用。谢谢

于 2012-09-27T09:45:09.123 回答