PHP-функция WSDL возвращает значение null, в то время как другая функция возвращает ожидаемый результат

Резюме

Здесь я перечислю все шаги, которые я предпринял для решения этой проблемы, в качестве ссылки для других.

1. PHP, как ни глупо, "слушает" входное сообщение функции, чтобы определить, какую функцию следует использовать. Так что дайте каждой из ваших функций разные входные сообщения, даже если они используют один и тот же тип или элемент. Вы можете подумать, что это довольно сложная задача для вас, но это можно сделать так:









 




Дальше Visual Studio ныла, я пару дней разбираюсь в этой дурацкой идиотской простоте, просто скажите программе, что вы только что установили свойство objects:

 UserCredentials.customerID = User.CustomerID;
 UserCredentials.customerIDSpecified = true;

И это все. Я сам не могу в это поверить. Я трачу 1,5 недели, решение состоит из двух шагов, пожалуйста, дайте этому парню, который ответил ниже, несколько голосов.

Обновление

Мой входной объект НЕ начинает анализироваться в XML.

//Исправить:

Вы должны сообщить программе, что свойство установлено вот так:

UserCredentials.customerID = User.CustomerID;
UserCredentials.customerIDSpecified = true;

Скрипач показывает это:

Вход



   


Выход

 





Что-то не так с этим кодом?

    public static List GetAllPersonen()
    {
        List list = new List();

        WeGotchaService.Persoon[] servicePersonen = dpc.getAllPersoonData(UserCredentials);

        foreach (WeGotchaService.Persoon p in servicePersonen)
        {
            Klant k = new Klant(p);
            list.Add(k);
        }

        return list;
    }

Обновите комментарий ниже


               
    
        
        

 
    


    


    
        
        
    
    
        
        
    

Кажется, это работает, за исключением того, что теперь он возвращает массив count=0 в VS10

. Еще одно обновление

В комментариях кто-то разместил ссылку на отчет об ошибке с PHP. Предпоследний комментатор утверждал, что он обошел ту же проблему, что и я, поместив все определения сообщений в другие файлы и включив их в этот основной документ WSDL. Я пробовал это, но это не сработало, ничего не изменилось.

ОБНОВЛЕНИЕ:

Итак, я изменил порядок функций, определенных в методе привязки, и выяснил следующее :работает только первая функция, определенная в области привязки, поэтому в данном случае работает только моя функция getAllLessenData, потому что я поставил ее выше всех остальных. Кто-нибудь видит ошибку?

 
    
    
        
        
            
        
        
            
        
    
    
        
        
            
        
        
            
        
    
    
        
        
            
        
        
            
        
    
    
        
        
            
        
        
            
        
    
    
        
        
            
        
        
            
        
    

конец обновления

У меня снова небольшая проблема с WSLD ()

моя функция getAllLessenData (и другие функции )возвращают NULL, а одна функция (getAllPersoonData )возвращает ожидаемое значение.

Определения массива WSDL:


            
                
                    
                
            
        
        
            
                
                    
                
            
        

Определения сложного типа WSDL:

        
            
            // lots of stuff //
            
        
        
            
            
        

Определения сообщений WSDL:


    


    

    
    

Определение типа порта WSDL

 
        
        
    
    
        
        
    

Защита привязки WSDL

        
    
        
        
            
        
        
            
        
    
    
        
        
            
        
        
            
        
    

Определения функций PHP:

function getAllPersoonData($customer_ID)
{
   connectToDB();
//////////// yes I use mysqli now /////////////
   $sql = "SELECT * FROM personen WHERE Customer_ID='". $customer_ID."'";

   $sql = mysql_query($sql) or die(mysql_error());
   $result = array();
   while($row = mysql_fetch_array($sql))
   {
  $row["Kosten_totaal"] = mysql_fetch_array(mysql_query("SELECT SUM(Kosten) FROM lessen WHERE Persoon_ID='". $row["ID"]."'"))[0];
    $row["Totaal_betaald"] = mysql_fetch_array(mysql_query("SELECT SUM(Bedrag) FROM betalingen WHERE Persoon_ID='". $row["ID"]."'"))[0];
    $lkbDatum = strtotime($row["Laatste_keer_bewerkt"]);
  $row["Laatste_keer_bewerkt"] = date("Y-m-d", $lkbDatum). "T". date("H:i:s", $lkbDatum);
  $result[] = $row;             
}
mysql_close();

   return $result;
 }


 function getAllLessenData($customer_ID)
 {
$sql = "SELECT * FROM lessen WHERE Customer_ID='". $customer_ID."'";
//////////// yes I use mysqli now /////////////
connectToDB();

    $sql = mysql_query($sql) or die(mysql_error());
$result = array();
while($row = mysql_fetch_array($sql))
{
  $result[] = $row;
}
mysql_close();

    return $result;
 }

 $server = new SoapServer("wsdl_service.wsdl");
 $server->AddFunction("getAllPersoonData");
 $server->AddFunction("getAllBetalingData");
 $server->AddFunction("getPersoonBetalingData");
 $server->AddFunction("getAllLessenData");
 $server->AddFunction("getPersoonLessenData");
 $server->handle();

Test.php

$client = new SoapClient("http://localhost/weGotcha/servicehandler/wsdl_service.wsdl", array("trace" => 1));

var_dump($client->__getFunctions());

var_dump($client->getAllLessenData(1));

var_dump($client->__getLastRequest());
var_dump($client->__getLastResponse());

который возвращает:

array (size=5)
  0 => string 'PersoonArray getAllPersoonData(int $CustomerID)' (length=47)
  1 => string 'LessenArray getAllLessenData(int $CustomerID)' (length=45)
  2 => string 'BetalingenArray getAllBetalingData(int $CustomerID)' (length=51)
  3 => string 'LessenArray getPersoonLessenData(int $getCustomerID, int $getPersoonID)' (length=71)
  4 => string 'BetalingenArray getPersoonBetalingenData(int $getCustomerID, int $getPersoonID)' (length=79)
null
string '
1
' (length=195)
string '
 

В моей базе данных есть строки, и вызов getAllLessenData (1 )непосредственно из моего servicehandler.php возвращает ожидаемые результаты. однако в моем test.php он просто возвращает NULL, а getLastResponse возвращает результаты из getAllPersoonData (1 ).

Для меня оба определения функций выглядят одинаково, черт возьми, я скопировал -и вставил большую их часть. Я пробовал менять пространства имен и т. д. Google. но это не сработало. Любые идеи?

Если вам нужна дополнительная информация, пожалуйста, ответьте.

12
задан 16 revs 17 August 2012 в 08:43
поделиться