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);
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/06/24 14:27:53
  • 終了:2008/06/29 22:34:20

ベストアンサー

id:tobeoscontinue No.2

tobeoscontinue回答回数214ベストアンサー獲得回数542008/06/27 20:43:50

ポイント60pt

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 '';
    }

id:halohalolin

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

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

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

※追記

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

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

の中の、()を削除して

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

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

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

2008/06/29 22:33:41

その他の回答(1件)

id:aerith No.1

aerith回答回数33ベストアンサー獲得回数12008/06/24 14:56:34

ポイント10pt

$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);

にしてみてください。

id:halohalolin

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

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

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

2008/06/24 21:19:48
id:tobeoscontinue No.2

tobeoscontinue回答回数214ベストアンサー獲得回数542008/06/27 20:43:50ここでベストアンサー

ポイント60pt

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 '';
    }

id:halohalolin

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

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

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

※追記

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

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

の中の、()を削除して

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

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

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

2008/06/29 22:33:41
  • id:tobeoscontinue
    $p->serialize() を$p->serializeに変えるというのでは動作がまったく違ってくるのでまずいと思います。

    mt.publishPostでぐぐったところ
    http://buzz.main.jp/blog/2005/11/xmlrpcblog.htmlがヒットしました。
    ここで書いてあるように
    $LoadMTPostId = new XML_RPC_Value($var_post_id, 'string');
    としてみてはどうでしょう。($var_post_idは実際の物に合わせて下さい)
  • id:halohalolin
    tobeoscontinueさん返答ありがとうございます。
    $p->serialize() を$p->serializeに変えたやり方では確かにご指摘のようにその後他の箇所でエラーが発生して困り果て、PEARを使わない「xmlrpc.inc」( http://phpxmlrpc.sourceforge.net/ )を使うやり方に切り替えを試していました。

    > $LoadMTPostId = new XML_RPC_Value($var_post_id, 'string');

    post_id の説明が抜けていましてすみません。
    私も$LoadMTPostIdの指定をこの上の行にて new XML_RPC_Value(実際のID, 'string'); と行っておりました。
    しかしエラーが発生しておりましたので、原因は他にあるのではないかと考えています。
  • id:tobeoscontinue
    既にxmlrpc.incに切り替えているようなので的はずれかもしれませんが。

    > 私も$LoadMTPostIdの指定をこの上の行にて new XML_RPC_Value(実際のID, 'string'); と行っておりました。
    > しかしエラーが発生しておりましたので、原因は他にあるのではないかと考えています。
    そうなるとserialize()ではエラーにならないと思うので....?

    var_dump($ValueMTMsg);
    $ValueMTResponse = $LoadMTBlogClient->send($ValueMTMsg);
    send()する前に$ValueMTMsgの内容を確認してみてはどうでしょう。

    echo $ValueMTMsg->serialize();
    では送信するxmlファイルの内容を確認できますので、設定している値が正しく反映されているか確かめる。

    などまず正しくxmlファイルが送信されているところまでで確認するなど、範囲を限定した方がいいように思います。
  • id:halohalolin
    tobeoscontinue さん、何度もつきあっていただきありがとうございます。

    確か悩んでいたときに、print_r($ValueMTMsg) として、IDとパスワードが入っているな等という程度は確認していましたが、xml出力まではチェックしていませんでした。
    次回、同じような境遇にあったときにはもっと色々試して対応したいと思います。
  • id:halohalolin
    「xmlrpc.inc」( http://phpxmlrpc.sourceforge.net/ )を使うやり方に切り替えましたところ、ソースを一部書き換えてカテゴリ一覧を取得したり、新着リストを取得できたので「これはイケル!」と考えました。
    しかし、投稿のところで謎のエラーが発生し、話が進まなくなりました。
    もし分かる方がいらっしゃいましたら教えてください。

    質問の受付はこちらにて行っています。
    http://q.hatena.ne.jp/1215176830

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません