ご存じのようにソフィア外語学院のメインサイトでは、アクセス・カウンターとメールフォームが設置されているのですが、ホームページのシステムのグレードアップで、これがネックになっていました。何が問題かというと、どちらもPHPというプログラミング言語で書かれているのですが、PHPのバージョンアップにより、仕様が変わったため、PHPをバージョンアップすると、動かなくなるのです。

恐らく、アクセス・カウンターの方はPHP4かPHP5のどちらかのバージョンで、メールフォームの方は、PHP5.2です。そして、最新のPHPはPHP7.3またはPHP7.4になっています。使っているサーバーでは最新版がPHP7.3です。だいたい、最新のPHPのバージョンを使っているサーバーでは、最新版が7.1から7.4のいずれかです。ただ、7.4は出たばかりなので、あまり推奨はされていません。

調べてみると、

7.0 2015年12月3日リリース
7.1 2016年12月1日リリース
7.2 2017年11月30日リリース
7.3 2018年12月6日リリース
7.4 2019年11月28日リリース

それで、5.2は2006年11月2日、5.6は2014年8月28日リリースです。つまり、5.6は7.0の約一年3か月前のバージョンです。6.xは放棄され、開発されていません。つまり5の次は7です。

すでに気の早いサーバー会社では、7.0は非推奨になっています。一方、最新スペックを追っていないサーバー会社では、未だに5.6までのバージョンしか用意されていません。

サーバー管理画面ではどうなっているかというと、好きなバージョンを選べるようになっています。一番古いバージョンは4.4(2005年7月11日リリース)ぐらいだったりします。

新しいバージョンにするメリットは、セキュリティー対策と処理速度です。パソコンのOSやその他のパソコンのソフトだと、普通、バージョンアップすると、処理速度が遅くなり、よりパワーのあるパソコンが必要になり、パソコンの買い換えを余儀なくされます。ものすごい悪知恵ですよね(笑)。

PHPのようなボランティアが集まって開発しているものは、処理速度が速くなるのです。実際のプログラムを走らせて測定すると、PHP7ではPHP5の2倍以上の速度になるらしいです。

だから、こっちが選んでいなくても、勝手にサーバー会社の方で7.1や7.2や7.3あたりにバージョンアップしてしまっているケースがあります。プログラムが動かなかったらどうするつもりなのでしょうね。

つまりそういう問題です。PHP4やPHP5で開発されたプログラムはPHP7では大抵動きません。なぜかというと、PHP4やPHP5で使われていた関数がPHP7で廃止されているからです。

しかし、いつまでもPHP5のままで放置というわけにはいかないので、PHP7に対応するようにプログラムを書き換えないといけません。しかし、何が廃止されて、その代わりにどういう関数を用いればいいのか、その際の書式は・・・というあたりが問題でした。

かなり大変なので、PHPのプログラマーにお願いしようかと思っていましたが、その前にとりあえず、自分でやってみようと思いました。

アクセス・カウンターは簡単でした。これは偶然、さくらインターネットのサーバー設定を見たら、勝手にPHP7.3にバージョンアップされていて、しかも動かないはずのアクセス・カウンターが動いていたからです。そこで、設定だけで何とかなることが予想できたので、さくらインターネットのサーバーの設定を調べました。どうやら、php.iniというファイルに下記の一行があるのが、動作する理由らしいと判明しました。

display_errors = off

onにしても、何も出ないのですが、これで動くなら、これでいいかと言うことで、早速、offにしてみました(笑)。ばっちり動きました。

メールフォームの方は、これをonにして、PHP7.xにすると、画面にたくさんエラーメッセージが出て、たぶん、普通の人だと、ショック死します。これをoffにすると、何も出ませんが、何も起きません。つまり、メールが送れません。

となると、中のプログラムを修正しないとだめです。いろいろ調べていく内に、どうも・・・

ereg

と言う関数が廃止されたのが、うちのメールフォームが動かなくなった原因だとわかりました。そこで、eregと言うのを全部preg_matchereg_replaceをpreg_replaceへと機械的に書き換えました。

ereg → preg_match

ereg_replace → preg_replace

すると、メールアドレスの形式が正しくないというメッセージが出て止まりました。(^ ^;

世の中そんな簡単なやり方でうまくいくわけはない・・・とはじめから思っていましたが、やはりそうでした。

そこで、メールアドレスの形式をチェックしていると思われる部分を探しました。程なく見つかりました。

これのどこが悪いのか・・・。いくら見てもわかりません。ifを使った条件文になっていますが、preg_matchの書式とか、メールアドレスの書式の表現の仕方がわからないからです。

ただ、恐らく、メールアドレスの書式とマッチするかどうかを調べて、合格すれば、パスで、合格しないと、エラーメッセージが表示されるというプログラムになっていると見ました。

preg_matchを使って、メールアドレスのチェックをやっている実装例をいろいろ調べて、その中で使えそうなものを選んで、その部分を置き換えてやりました。自分で考えるのは大変だし・・・。(^ ^;

すると、動作しました(笑)。

具体的には、下記のコードです。さすがにそのままでは動作しないので、参考にした他の人のコードとは、ちょっと変えてあります。

preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\?\*\[|\]%'=~^\{\}\/\+!#&\$\._-])*@([a-zA-Z0-9_-])+\.([a-zA-Z0-9\._-]+)+$/", $post['mail'])

これで完全に動作するようになりました。

どうだ、おろろいたか・・・と世界に向かって叫んでみたくなりました(笑)。

関連ページ:
preg_match (PHP: Hypertext Preprocessor)
下位互換性のない変更点(PHPマニュアル)
ereg_replace(PHP: Hypertext Preprocessor)
PHPメールチェック正規表現(Qiita)
正規表現:メールアドレスかどうか調べる(phpspot)
「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ(404 Blog Not Found)
PHP5とPHP7の処理速度の違い(PHP Presents)