備忘録のため,内容の正当性については責任を持ちません。

某お客様が使用中のレンタルサーバが PHP 4 → PHP 5 にアップデートされ、今まで稼動していた osCommerce が動かなくなったとのこと。PHP4 なんてとうの昔にサポートが終了しているし、最新版の osCommerce ではこのようなことはないのだが、とりあえずの解決策をメモしておく。


現象

osCommerce が

FATAL ERROR: register_globals is disabled in php.ini, please enable it!

というエラーを吐いて動かなくなった。そこで、設定で register_globals を on にすると、次は

Fatal error: Using $this when not in object context in /home/***/includes/header.php on line 404

というエラーを出しはじめた。


解決法

PHP5 では class の中以外では $this という変数名を使えなくなった。そのため、すべての PHP ファイルを調べて、class の外で使われている $this を $THIS などの適当な変数に置換することで解決した。

未検証だが、たぶん次のような Perl スクリプト (update.pl) で自動化できる。

#!/usr/bin/perl

use strict;

foreach my $file (@ARGV) {
    if (!open(FH, '+<' . $file)) { next; }

    my @lines = <FH>;

    seek(FH, 0, 0);
    truncate(FH, 0);

    my $flag = 1;
    foreach (@lines) {
        if ($_ =~ /^[\t|\s]+class /) { $flag = 0; }
        if ($flag) { $_ =~ s/\$this\->/\$THIS\->/g; }
        print FH $_;
    }

    close(FH);

    print "update: " . $file . "\n";
}

コマンドラインで osCommerce のディレクトリに移動し、このスクリプトを次のように実行すれば良い。

$ find . -name '*.php' | xargs perl ./update.pl

早めに最新版にアップデートしないとな。。

コメント

コメントする




CAPTCHA