先日、とつぜんMovableTypeの動作がおかしくなりました。
記事を保存すると以下のエラー表示がでるようになりました。
同じように困っている方がいると思うので備忘録的に対処方法を掲載しておきます。
Can't call method "execute" on an undefined value
"execute" ん?なんじゃそりゃ?
"はダブルクォーテーションの文字参照なので
Can't call method "execute" on an undefined value
ということみたいですが、突然何でエラーが発生したのかよくわかりません。
ソースを一切いじってないし。。
現象を調べてみると、記事単体は作成できているようなのですが、メインページのindex.htmlとブログ記事リストページのblog.htmlのインデックステンプレートの再構築でエラーになっているようでした。
困った。。記事の更新ができないぞ。。。
index.htmlのソースのどこに問題が発生しているのかを探るために部分部分をコメントアウトしてエラーの場所が特定できました。
記事の画像をランダムにサムネイル化している部分でエラーが発生するようになっていました。
このサムネイル画像の部分のソースでエラーが発生しています。
今まで動作していたのに何でだろう?とりあえずその部分をコメントアウトしたらindex.htmlは構築できるのでコメントアウトすることに。
しかしblog.htmlのほうはサムネイル画像がないのに同じエラーがでます。
んー。。。謎だ。。。
とりあえずもう少し詳しく調べるために
まずMovable設定ファイル mt-config.cgi に以下の行を追加して調べてみました。
DebugMode 1
すると先ほどのエラーメッセージが以下のように表示されるようになりました。
<pre>Can't call method "execute" on an undefined value
at *****/extlib/Data/ObjectDriver/Driver/DBI.pm line 127.
</pre>
※ *****の部分は私のMT環境のパスが記載されていました。
DBI.pmってデータベースのモジュールです。
データベースがおかしくなったのかなぁ。こりゃまずいな。
と思い、同じようなことで困っていた人がいないか調べてみたら以下のサイトにたどり着きました。
Minase's Blog - FYA
http://www.fya.jp/blog/2009/06/03/mt/#extended
——————————————————————————————–(記事を抜粋)
Can’t call method “execute” on an undefined value at */extlib/Data/ObjectDriver/Driver/DBI.pm line 127.
エントリーを投稿するとエラーが表示されるようになりました。
エントリー数は1000少しです。
早速調べてみるとテンプレートモジュール「ヘッドライン」の以下のタグが問題の引き金であることがわかりました。
<MTEntries sort_order=”descend” lastn=”9999″>
200づつ分割して処理させる為に、以下のように編集することで問題を回避できました。
<mtSetVarBlock name=”ent_count”><$MTBlogEntryCount$></mtSetVarBlock>
<mt:for var=”arc_loop” from=”0″ to=$ent_count increment=”200″>
<MTEntries sort_order=”descend” lastn=”200″ offset=$arc_loop>
*
</MTEntries>
</mt:for>
値をあまり大きくするとエラーになるようです。
——————————————————————————————–(記事を抜粋)
ふむふむ、MTEntiesで大量の記事を一度に処理をすると上記のエラーが出るようです。
サムネイルの処理は全てのの記事のデータから処理していますし、blog.htmlのページもブログの記事一覧のページなので全ての記事を処理しています。
実際、私のブログの記事もちょうど1000件を超えたところでエラーが出始めました。
原因はこれだ!!
全ての記事を処理するのに私のソースでは<MTEntries lastn=”0″>
としていたので該当する部分を上記のようにループ処理で分割で処理するようにしたら解決しました。
水瀬さん、ありがとうございました!
コメント