サーバーはカゴヤの共有サーバー(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);
よろしくお願いします。
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 ''; }
$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さんありがとうございます。
試してみましたが、改善しませんでした。
同じエラーが引き続き発生します。
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"(再構築)の効果が働いていないような気がするのですが、もう少し試してみます。ありがとうございます。
tobeoscontinueさん、わざわざ内部的なところまで追跡していただいて大変ありがとうございます。
確かにこの方法でエラーはでなくなりました。
他の動作には支障はないかどうか調べていきます。
※追記
serialize()の中身を変えるやり方ですと、他の箇所でエラーが発生したのですが、
$this->payload .= "<param>\n" . $p->serialize() . "</param>\n";
の中の、()を削除して
$this->payload .= "<param>\n" . $p->serialize . "</param>\n";
とするとそういったエラーもでなくなりました。
ただ、"mt.publishPost"(再構築)の効果が働いていないような気がするのですが、もう少し試してみます。ありがとうございます。