integerの範囲を超える暗黙のfloat型変換について - PHPプロ!Q&A掲示板

2841

  • 0P

integerの範囲を超える暗黙のfloat型変換について

質問日時 / 2010年8月19日 12:05    回答数 / 4件

Questioner:  fc_abc  このエントリーをはてなブックマークに追加 

キーワード / SOAP    型変換    float   

PHP5.0.5でSOAPクライアントを利用しています。(サーバーは別)
SOAPで取得した値にintegerの範囲をこえる整数(マイナスもあり)の項目があり、
PHPで取得したときにはfloatに変換されてしまいます。
どうにか文字列で取得したいのですが、どうしたらいいでしょうか。

●RESPONSEのSOAPメッセージ(__getLastResponseHeaders()で表示させたもの)
・・・
  1. <GetdataResult>
  2. <returnCode>0</returnCode>
  3. <dataId>-1689063492100853782</dataId>
  4. <dataD>6805421039091656395</dataD>
  5. </GetdataResult>
・・・

●PHPでvar_dumpした取得した値
object(stdClass)#1 (1) { ["GetdataResult"]=> object(stdClass)#4 (3) { ["returnCode"]=> int(0) ["dataId"]=> float(-1.6890634921009E+18) ["dataD"]=> float(6.8054210390917E+18) } } 

上記でfloar()となってしまいます。
誤差をなくしたいので、文字列等、そのまま取得したいのですが、
どのようにしたらいいでしょうか。

よろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01mgngmgngサーバ側で文字列として返してもらうか、 __getLastR
 ┗A01-1fc_abcありがとうございました。 無事文字列での取得ができ
  ┗A01-1-1fc_abc取得はできたのですが、同じ値を使って引数としてセッ
   ┗A01-1-1-1fc_abc自己レスです。 失礼ました。 セットできました。

回答一覧

並び替え:

A01
answerermgngmgng [8月19日 13:05]

サーバ側で文字列として返してもらうか、
__getLastResponseHeaders() を simplexml_load_string 等経由して加工するなど。

  1. <?php
  2. $xml_str = '<GetdataResult>
  3. <returnCode>0</returnCode>
  4. <dataId>-1689063492100853782</dataId>
  5. <dataD>6805421039091656395</dataD>
  6. </GetdataResult>';
  7.  
  8. $xml = simplexml_load_string($xml_str);
  9.  
  10. echo
  11.  (string)$xml->dataId,
  12.   PHP_EOL,
  13.  (string)$xml->dataD;

この意見に回答する

ツリーへ TOPへ

A01-1
replyerfc_abc [8月19日 14:59]

ありがとうございました。
無事文字列での取得ができました。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyerfc_abc [8月19日 16:05]

取得はできたのですが、同じ値を使って引数としてセットすると
request作成時にまたintval()して設定されているようです。
requestをintにしないでそのまま渡す方法、もしくはrequestを上書きするなど、
方法はありませんでしょうか。

  1. $client = new SoapClient($wsdl,array('trace'=>1,'encoding' => "UTF-8"));
  2.  
  3. //この時点の$paramをprintすると、文字列"7784989484768396079"となっている
  4.  
  5. $result3 = $client->auth3($param);
  6.  
  7. echo $client->__getLastRequest();
  8.  
  9. //このechoで表示された値が以下
  10. <ns1:dataId>2147483647</ns1:dataId>

"7784989484768396079"をintval()すると2147483647になります。
また、wsdlでは type="s:string"としました。

"7784989484768396079"のまま渡すにはどうしたらいいでしょうか。
よろしくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerfc_abc [8月19日 16:11]

自己レスです。

失礼ました。
セットできました。

php.iniのsoap.wsdl_cache_enabledがonのままで、wsdlの変更が効いていませんでした。
(type="s:long"からtype="s:string"の変更を行いました)

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)