人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PEARでXML_RPCを使いたいのですが、new XML_RPC_clientを設定した変数から$LoadMTBlogClient->send(送信する内容);とした際に「Fatal error: Call to a member function on a non-object in (省略)/PEAR/XML/RPC.php on line 1292」というエラーが発生して使うことができません。これは何が間違っているのでしょうか?
サーバーはカゴヤの共有サーバー(PHP Version 4.4.8)で、PEARはgo-pear.phpをダウンロードしてインストール(1.7.2)しました。
現在インストール済みのPEAR packageは以下の通りです。

Archive_Tar 1.3.2 (stable)
Cache_Lite 1.7.4 (stable)
Console_Getopt 1.2.3 (stable)
HTML_Common 1.2.4 (stable)
HTML_Template_IT 1.2.1 (stable)
Log 1.11.0 (stable)
PEAR 1.7.2 (stable)
PEAR_Frontend_Web 0.7.2 (beta)
Structures_Graph 1.0.2 (stable)
XML_Parser 1.2.8 (stable)
XML_RPC 1.5.1 (stable)
XML_Serializer 0.18.0 (beta)
XML_Util 1.1.4 (stable)

send(送信する内容);の送信する内容は以下の通りです。
$LoadMTUsername = new XML_RPC_Value(SET_MT_USERNAME,'string');// username
$LoadMTPassword = new XML_RPC_Value(SET_MT_PASSWORD,'string');// password

$ValueMTMsg = new XML_RPC_Message(
"mt.publishPost",
array($LoadMTPostId, $LoadMTUsername, $LoadMTPassword)
);
$ValueMTResponse = $LoadMTBlogClient->send($ValueMTMsg);
よろしくお願いします。

●質問者: くじぇ
●カテゴリ:インターネット ウェブ制作
✍キーワード:BETA Go MT object ON
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● aerith
●10ポイント

$LoadMTUsername =& new XML_RPC_Value(SET_MT_USERNAME,'string'); // username

$LoadMTPassword =& new XML_RPC_Value(SET_MT_PASSWORD,'string'); // password

$ValueMTMsg =& new XML_RPC_Message(

"mt.publishPost",

array($LoadMTPostId, $LoadMTUsername, $LoadMTPassword)

);

$ValueMTResponse =& $LoadMTBlogClient->send($ValueMTMsg);

にしてみてください。

◎質問者からの返答

aerithさんありがとうございます。

試してみましたが、改善しませんでした。

同じエラーが引き続き発生します。


2 ● tobeoscontinue
●60ポイント ベストアンサー

XML_RPCを理解していないのですがエラーから追っていくと

RPC.phpの1292行目は

 $this->payload .= "<param>\n" . $p->serialize() . "</param>\n";

となっています。Call to a member functionとあるのでこの中では$p->serialize()がエラーになっていると思われます。

$pが何かというと上の行で

 $p = $this->params[$i];

となっています。$this->paramsを何処で定義しているかというと

 function addParam($par)
 {
 $this->params[] = $par;
 }

のaddParam()で定義しています。ではaddParamを何処で使っているかというと

 function XML_RPC_Message($meth, $pars = 0)
 {
 $this->methodname = $meth;
 if (is_array($pars) && sizeof($pars) > 0) {
 for ($i = 0; $i < sizeof($pars); $i++) {
 $this->addParam($pars[$i]);
 }
 }
 }

のXML_RPC_Messageの$parsがaddParam()されて、それが$pとなります。

よって

 $ValueMTMsg = new XML_RPC_Message
         ("mt.publishPost", array($LoadMTPostId, $LoadMTUsername, $LoadMTPassword));

の$LoadMTPostId, $LoadMTUsername, $LoadMTPasswordはserialize()の関数を実装している必要があります。

$LoadMTUsername, $LoadMTPasswordはXML_RPC_Valueを生成したものなのでserialize()を実装しています。

$LoadMTPostIdはどのクラスのものなのか解かりませんがserialize()を実装していない思います。

とりあえず空文字を返すserialize()を実装すればこの部分は通ると思います。

 function serialize()
 {
 return '';
 }

◎質問者からの返答

tobeoscontinueさん、わざわざ内部的なところまで追跡していただいて大変ありがとうございます。

確かにこの方法でエラーはでなくなりました。

他の動作には支障はないかどうか調べていきます。

※追記

serialize()の中身を変えるやり方ですと、他の箇所でエラーが発生したのですが、

$this->payload .= "<param>\n" . $p->serialize() . "</param>\n";

の中の、()を削除して

$this->payload .= "<param>\n" . $p->serialize . "</param>\n";

とするとそういったエラーもでなくなりました。

ただ、"mt.publishPost"(再構築)の効果が働いていないような気がするのですが、もう少し試してみます。ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ