PHP 5.6 SoapClient传递十进制bug

时间:2016-05-02 08:03:28

标签: php soap decimal

我尝试使用SoapClient函数将PHP数组解析为SOAP XML。 我必须将一个十进制数解析为SOAP。我的PHP数组看起来像这样:

$contactparams = array(

"DECIMALVARIABLE"=>0.00

);

执行SOAP调用时,我得到的错误是我应该使用带小数点后2位的十进制数。我猜它PHP函数将0.00转换为普通0。

抛出错误的示例:

  

致命错误:未捕获的SoapFault异常:[soap:Client]无效   数字2dp值(0)

当我使用0.01时,效果很好。

我已经尝试将其解析为字符串" 0.00" &安培; 0.00""

我还尝试使用number_format函数创建0.00,但结果相同。

如何解决这个问题的任何想法都将非常感激。

3 个答案:

答案 0 :(得分:4)

经过几个小时的寻找解决方案,我终于找到了一个狡猾的解决方案......

当输入值0.001时,SOAP的函数会将其更改为正确的值0.00

SO:

$contactparams = array(

"DECIMALVARIABLE"=>0.001

);

得到:

DECIMALVALUE=0.00

不是一个干净的解决方案,但有一个有效..

答案 1 :(得分:1)

这个肮脏的技巧可以帮助你理解这个错误真的与你的十进制变量有关

<?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

答案 2 :(得分:1)

“shortnumber2dp”类型的字段必须以2位小数递送:0.00而不是0

确保您没有在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

修复此问题

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