MT4.01でブログを書くボタンを押すとエラーが出る件に無理矢理対処した話

 WordPressで運用しているサイトにMTのことを書くのもアレなのですが。
 X-Serverで稼働しているマンガ感想サイトで使用しているMovable Type 4.01ですが、記事が15件になった時点で「ブログを書く」ボタンを押すと、

Statement has no result columns to bind (perhaps you need to successfully call execute first) at (MTをインストールしたディレクトリ)/extlib/Data/ObjectDriver/Driver/DBI.pm line 120.

 というエラーが発生するようになりました。
 一度データを削除してインポートし直しても、別データベースを作ってそこにデータをインポートしても、データベースに復旧をかけても、全然このエラーが解消しません。エラーメッセージで検索をかけても解決方法を書いているところはないようで、どうも一度出たらもうダメ系のエラーっぽいです。

 DBI.pm のエラーが出ている箇所を色々調べた結果、”SELECT config_id, config_data FROM mt_config WHERE (config_id IN (?))“(? はブログID。こちらの環境では1) という SQL を実行し、bind_columns で config_id と config_data の値を配列に設定しようとしているところで発生しているということは判りましたが、でも判ったところでどうしようもないというか、何故ここでこんなエラーが出るのかまでは判りませんでした。MySQLやDBIのバージョンに依存する問題なのかも知れません(MySQL 4.0.25, DBIのバージョンは不明)。
 ただ、エラーが出る部分のSQLは正直それほど重要なものではなさそうなので、これって別に無視してもいいんじゃね? みたいなことを思ったのも事実。

 仕方がないので、エラーが出る箇所を eval で囲み、エラーを無視するという行き当たりばったりな対処をしてみたところ、「ブログを書く」ボタンを押してもエラーが発生しなくなり、そのまま記事を書いて保存できるようになりました。
 何だかよく判りませんが、とりあえずこれで問題には対処できたので、一応ここで修正したコードを公開しておきます。

extlib/Data/ObjectDriver/Driver/DBI.pm の 120行目以降を、以下のように修正

    eval { $sth->bind_columns(undef, @bind); };
    if (!$@) {
      # need to slurp 'offset' rows for DBs that cannot do it themselves
      if (!$driver->dbd->offset_implemented && $args->{offset}) {
          for (1..$args->{offset}) {
              $sth->fetch;
          }
      }
    } else {
      warn $@;
      $sth->fetch;
    }

    # TBD what happens if $sth goes out of scope without finish() being called ?

※これによって何が起こっても私は一切関知しません。自己責任でお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です