PHPヴァージョンアップ備忘録

旧の掲示板は,「画像掲示板plus」というPHPで書かれたものを使ってました。このプログラム(スクリプト)は,「LEMON-S PHP」というHPに掲載されていたものです。あまり需要がないのか,更新が途絶えているようで,サポート掲示板も,2016年の作者の書き込みを最後に,更新されてないようです。2016年は,PHP7になった頃でしょうか,サポートにもPHP7で「画像掲示板plus」を動かすにはどうすればいいか,ちょっとだけ記述がありました。
この旧掲示板は,私にとってもいろいろな情報が残ってるので,表示だけは残したかったので,PHPの初心者の私が,ネットサーフィンをたよりに,V5⇒V7にアップデートしても動くように,無謀な挑戦をしたところです。
「LEMON-S PH」には,まだ,PHPのスクリプトが残ってますので,2015年に更新されたv2.36をDLしました。このファイルは,このままだと文字化けを起こしますので,

    SHIFT-JIS⇒⇒UTF-8

のように変換して,保存しました。また,サーバー上に残ってる,「imglog.log」というCSV形式のデータもUTF-8で保存しなおしました。
一方,最低限必要なPHPとアパッチをどうするか迷いましたが,それぞれにインストールすると細かい設定が面倒そうで,デバック環境を作るだけでも時間がかかりそうなので,諸兄のHPを見ながら,「XAMPP」という,PHPプログラム作成の環境を一括インストールで作成できるものを導入しました。

導入後早速その環境で,該当するプログラムを動作させ,あれこれ始めました。また,公開しているHPのようにまっしろかなと思いましたが,

    Warning: Use of undefined constant

という警告が20以上でてきました。

意味がわからなかったのですが,ネットくぐってみると,該当の行の該当の項目に「’ ‘」の記述がないことが原因であることがわかりました。そこで,

    修正前・・・・・・define(LOGFILE, ‘imglog.log’);
    修正後・・・・・・define(‘LOGFILE’, ‘imglog.log‘);

のように変更しました。defineの括弧の後半(赤字部分)が数字の場合,シングルクーテーションがあるところとないところがあり,その違いが分かりませんでしたが,下記のように統一しました。

    修正後・・・・・・define(‘MAX_KB’, 500)

これで,「Warning」はほとんどなくなりました。PHP5では,このシングルクオーテーションがなくても,きちんと動いてた様で,PHP7では,そのチェックが一層厳しくなったそうで,この結果になってるようです。

まだ消えないエラー表示を見てみると

    Fatal error: Uncaught Error: Call to undefined function eregi()

というのがあり,これも調べてみると,PHP5で使われていた備え付けの関数がPHP7では,廃止になったとのことで,代替えの関数として,

    preg_match

が使えるとのことなので,

    修正前・・・・・・eregi($value,$ref)
    修正後・・・・・・preg_match(‘/$value/i’,$ref)

のように変更。このFatal error:があるとプログラムはそこで,止まってしまうようで,もう一カ所修正箇所がありました。

修正前・・・ereg_replace(“(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)”,”<a href=\”\\1\\2\” target=\”_blank\”>\\1\\2</a>”,$proto);
修正後・・・preg_replace(“/(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)/“,”<a href=\”\\1\\2\” target=\”_blank\”>\\1\\2</a>”,$proto);
再修正・・・preg_replace(“/(https?|ftp|news)(:\/\/[[:alnum:]\+\$\;\?\.%,!#~*\/:@&=_-]+)/”,”<a href=\”\\1\\2\” target=\”_blank\”>\\1\\2</a>”,$proto);

 

修正後,懐かしい画面の片割れがでてきましたので,ここでも少し「やった。」になりました。懐かしい画面と一緒にでてきたのは,書き込みの表題だけでした。

修正したものを見ると,再修正が必要で,最終的に,青で示したエスケープシーケンスを挿入すると,コメントまで表示できました。

PHP側で,正規表現のはじめ「/」と,終わのりを意味する「/」の他にあるスラッシュを区別する必要があり,区切りでないスラッシュは,「¥/」とする必要がありました。

表題・コメントが表示できたのはいいのですが,それと同時に大量のNOTICEがでてきました。

   Notice: Undefined variable: r_com

調べてみると,定義してない(NULL)状態の変数に操作をしているために起きるようで,それぞれの変数の直前に

    r_com=””

という記述で,変数は空(何も入ってないですよということらしい)ということを代入して,このNotice:を消しました。

その後,どうしても画像を表示できず,画像を操作していると思われるところを一つ一つ確認していきました。結局,WINDOWSの環境でデバックをしていましたので,ドライブの指定が間違っていて,小文字を大文字に変えたら,あっけなく表示できました。思わず,そばにいた妻に「やっった。」と叫んで,そのわけを説明しました。という訳で長い道のりでしたが表示だけできました。

でも,どうしても消せないNotice:があるので,あれこれこも調べましたが,プログラムで表示させなくできるということで,PHPのファイルの冒頭に,

error_reporting(E_ALL & ~E_NOTICE);

を記入することで,消すことにしました。しかし,消してみると新たに,

Deprecated: Function get_magic_quotes_gpc()

というエラー出てきました。これも調べてみると,PHP7では,実装されてなくて,常にFALSEを返すということで,該当の部分には,

 if(get_magic_quotes_gpc()) $gazoubbs = stripslashes($gazoubbs);

のような記述で,get_magic_quotes_gpc()が有効なら$gazoubbs = stripslashes($gazoubbs)を実行するということでした。常にFALSEを返すことから,$gazoubbs = stripslashes($gazoubbs)は実行されないので,ここは,削除することにしました。

これで,やっと,エラーも表示されなくなり,閲覧だけできるようになりました。

{追記}PHPのプログラムを追っていくなかでいくつか分からない表現にであいました。
      .$value.
    のような表現で,これも調べてみると,文字の結合を表す表現でした。分かったのもありますが,
        $dat.=’     のような表現が所々に,あり,このシングルクオ-テンションの意味が未だに不明です。単に$datに    「`」を結合するものなんでしょうか。