PHP5からPHP7へのハードル

PHP5からPHP7へのハードル

暫くWeb開発から遠ざかっていたせいか、PHP7なるものが出た事を最近知った。PHP5から何がどう変わったのか定かではないが、使っているレンタルサーバーによれば、サーバー負荷が低減され2倍以上高速化しているという。またWordpressは勿論、Modxでも既に対応しているらしい。

そこで自作システムで運用しているサイトも含め、WebサーバーをPHP7に切り替えるべくいろいろ試したら・・・・やはりスンナリとは行かなかった。

※2017/09/20:以前このページに記載していたローカルサーバーの構築については別ベージに分離・独立させた。

未定義変数のエラー

まず、ローカルサーバーに設置した自作システムのページをブラウザで表示させると、エラーメッセージだらけだった(;´∀`)

最初のメッセージは、Undefined index: idという内容で、idというのはGETパラメータの1例。つまりif($_GET["id"]==1){...といったコードになっているのだが、そんなパラメータは存在しないという警告らしい。確かに、このページのURLはidというパラメータはGETしてないが、PHP5.4では何もエラーは出なかった。

そこでif(isset($_GET['id'])){と先ず仮定しておいて、続けて$id=intval($_GET['id']);等と書けばOKだった。つまりPHP5.4では、値を代入していない変数があってもそのまま空欄でスルーしてくれたが、PHP7ではダメらしい。

mysql_query

続くエラーは殆どがmysql_queryの行で発生。最初は解らなかったが、実はこの関数自体がPHP7では削除されてしまったらしい。という事は、データを抽出しているコードは全滅(・_・;) 仕方ないというか良い機会なので、既に他のページでは使い始めていたPDOで統一することにした。

基本的にはmysql_queryの部分を$dbh->query("SQL文")みたいに変更すれば行けそうだが、折角だからデータを列挙する時は、foreach($dbh->query("select...") as $record)とやってコードをシンプルにした。

mysql_connect

上述のページ(サイト)のエラーを全て解消した後、別のサイト(これも独自システム)にアクセスすると、fatal errorが出てその他は何も表示されない。どうもデータベースに接続するところで躓いてるようだ。結局その原因はmysql_connectだった。つまりこの関数もPHP7では使われなくなっていたのだ。

そこでこれもPDOを使って接続するコードに変えたら繋がるようになった。因みに、上述のページは偶々DB接続だけはお試しでPDOを使っていたので繋がったのだ。mysql_queryの部分はそのままだったというわけ。

データベースの連想配列の読み出し方

データベースのレコードは連想配列の形で格納するが、PHP5以前はそれをmydata[name]のように呼び出していた。しかしPHP7で同じようにやるとUnknownエラーが出る。正しくはmydata["name"]という風にキーをダブルクォーテーション(又はクォーテーション)で囲む必要があるようだ。

このエラーは何故かローカルにXAMMPでサーバーを構築した時には出なかったので、そのまま本番環境に移行したらエラーが出まくって復旧に大分時間がかかってしまった。

まとめ

「PHP5 PHP7」で検索すると本家サイトがヒットするが、ここにはmysql絡みの変更点など書いていない。他の個人サイトでも同様で、もっと高尚な変更点が書かれていた、僕のコードとは関係無さそうに見えた。しかしそれはphp5.xのファイナルバージョンからphp7への変更点という意味のようだ。

確かにPHP 5.5.x で推奨されなくなる機能の中にMySQL拡張モジュールが含まれている。しかし、この時点ではあくまで非推奨であってまだ使えている。PHP7で初めて非対応になったのだから、PHP7で「下位互換性の無い機能」の中にMySQL関連を記述すべきだと思うが。

どうもPHPって、割りとルーズな書き方が許容されてたのに後に禁止されたり、関数自体が無くなったり新設されたりしすぎじゃないの?他のプログラム言語でもこんなに頻繁に変わったりするのかなあ?

Share me!Share on Google+Share on FacebookTweet about this on TwitterShare on TumblrPin on Pinterest

コメントを残す

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