2016-05-02 11 views
9

Próbuję parsować tablicę PHP do SOAP XML z funkcją SoapClient. Muszę parsować liczbę dziesiętną do SOAP. Moje PHP tablica wygląda lik to:PHP 5.6 SoapClient przekazując błąd dziesiętny

$contactparams = array(

"DECIMALVARIABLE"=>0.00 

); 

Podczas wykonywania połączenia SOAP Dostaję błąd rzucony że powinienem użyć liczbę dziesiętną z 2 miejsc po przecinku. Moi go odgadnąć, że funkcja PHP konwertuje 0,00 zwykły 0.

przykładem błędu rzucony:

Fatal error: Uncaught SoapFault exception: [soap:Client] Invalid number 2dp value (0)

Gdy używam 0,01 to działa dobrze.

Ja już próbował analizować je jako ciąg „0.00” & 0.00. „”

Próbowałem zostały również funkcję Number_format do utworzenia 0,00, ale z tym samym skutkiem.

Wszelkie pomysły na rozwiązanie tej zagadki będą bardzo mile widziane.

+0

Jaki jest typ pola w umowie dotyczącej mydła (wsdl)? –

+0

Nie jestem pewien, co masz na myśli, ale: Może link integracyjny ma większą wartość: http://samacom.dyndns.org:5912/davewslink/ integration.wsdl –

+0

Kiedy wyświetla się "0.00", jak wygląda błąd? Co powiesz na próbę wrzucenia przestrzeni po obu stronach? –

Odpowiedz

4

Po godzinach poszukiwania rozwiązania, jakie w końcu znaleźć przebiegły jedną ...

Podczas wprowadzania funkcji wartości 0,001 mydło zmienia to do prawidłowej wartości 0.00

SO:

$contactparams = array(

"DECIMALVARIABLE"=>0.001 

); 

DAJE:

DECIMALVALUE=0.00 

Niezupełnie czyste rozwiązanie, ale takie, które działa ..

+1

sprytne obejście! –

1

ten brudny trik może pomóc zrozumieć ten błąd bardzo podobne do Ciebie dziesiętnych Zmienna

<?php 

class MySoapClient extends SoapClient 
{ 
    public $decimalValue; 
    function __doRequest($request, $location, $action, $version) { 
     if (is_null($this->decimalValue) 
      throw new Exception("you forgot to set decimalValue"); 
     $request = str_replace('#decimalValuePlaceHolder#', $this->decimalValue, $request); 
     $ret = parent::__doRequest($request, $location, $action, $version); 
     $this->__last_request = $request; 
     return $ret; 
    } 
} 

// usage 
$contactparams = array(
    "DECIMALVARIABLE"=>'#decimalValuePlaceHolder#', 
); 

$client = new MySoapClient(); // initialize this as prev SoapClient 
$client->decimalValue = "0.00"; // or number_format($someNumber, 2); // any decimal variable 
$client->callFunction(); // call you function as you did before 
+0

Jestem już pewien, że ten błąd dotyczy mojej zmiennej dziesiętnej. Mimo to dziękuję –

+1

, a następnie możesz użyć tego do rozwiązania sprawy.dopasuj str_replace do twoich potrzeb, a będziesz mógł wysyłać pożądane wartości. –

+1

Użycie 'str_replace()' sugeruje, że po prostu wysłałoby to jako ciąg znaków, co już jest napisane, nie działa. – miken32

1

pól typu „shortnumber2dp” musi być dostarczona z 2 miejsc po przecinku: 0,00 a nie 0

Upewnij się, że nie przechodzą pusty ciąg w number_format

echo "A. ".number_format(null, 2)."\n"; 
// output 0.00 
echo "B. ".number_format(0, 2)."\n"; 
// output 0.00 
echo "C. ".number_format('', 2)."\n"; 
// error 

rozwiązać ten problem

if(empty($value)){$value = 0;} 
+0

Hi peter, kiedy robię print_r mojej tablicy PHP, otrzymuję poprawne wartości: [DECIMALVARIABLE] => 0.00, jednak przy konwersji tablicy php na SOAP myślę, że dostosowują wartość 0.00 do zwykłego 0 –

+0

@JoeriMinnekeer tam odpowiedniki typów, które można przekazać tej zmiennej? na przykład "dziesiętny" w type = "omnis: shortnumber2dp" –

+0

Jeśli przypadkiem Twoja sytuacja ma związek z tym podręcznikiem http://www.omnis.net/download/manuals/Omnis_Programming.pdf, to gdybym był na twojej pozycji, spróbuj innego typu, takiego jak numer 2dp i pływający, aby sprawdzić, czy nie ma problemu przy korzystaniu z tych typów. Jeśli nadal masz problem, to radzę opublikować swoją klasę mydła, funkcję, kod, aby twoje pytanie było bardziej kompletne. –

Powiązane problemy