0

PHP 関数で連想配列を返そうとしています。この関数は、MySQL から一部のデータを取得し、Zend ライブラリを使用して 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;

    }
}

次に、(Zend Lib を使用して) SOAP 経由で関数にアクセスできるようにする別の PHP ファイルがあります。

サーバー.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; };}
   ]; 
  }

キーと値のプロパティを使用してこの応答を繰り返すこともできますが、次のような応答があれば、はるかに優れた (そして効率的な) ものになると思います。

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

さて、私は解決策を見つけました。

Web サービスで結果を発行する 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) ){
            $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;

    }
}

関連するすべての属性を持つクラスを以前に作成しました。次のように単純です。

TestClass.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 に答える