PHP

【情報】PHP7でMySQLに関する関数が一新された件

2020年11月22日

はじめに

こんにちは、SANACHANです。

サーバーサイドのスクリプト言語の代表であるPHP言語。クライアント側(ブラウザ等)に動的なコンテンツを提供するための言語で、様々なWebサイトで使用されています。Wordpressで作成されたWebサイトは全てこのPHPが使用されています。

たくさんのWebサイトで利用されていることもあり、セキュリティの観点から、バージョンアップ時に既存関数が削除される場合があります。

昔作成した家計簿のWebアプリが動作しなくなり、調べてみるとMySQLに関する関数が一新されており、「そんな関数ないよ!」というエラー「HTTP Response 500 (Internal Server Error)」が出ていました。

今回は、PHP5からPHP7のMySQLに関する更新内容と、更新後の対処方法を記載します。

こんな方におすすめ

  • PHPとMySQLを使うWebアプリで、急にデータベースに接続できなくなり困っている
  • 接続できない原因は分かったけど、良い対処方法が分からない

 

語句説明

PHPとは

Wikipediaには、以下のように記載されています。

PHP(ピー・エイチ・ピー)は "The PHP Group" によってコミュニティベースで開発[3]されているオープンソースの汎用プログラミング言語およびその公式の処理系であり、特にサーバーサイドで動的なウェブページ作成するための機能を多く備えていることを特徴とする。

SANACHAN
SANACHAN
冒頭で少しふれた内容がそのまま記載されていますね。

 

MySQLとは

Wikipediaには、以下のように記載されています。

MySQL(まい・えすきゅーえる)は、オープンソースのリレーショナルデータベース管理システム(RDBMS)である。その名前は、共同設立者のMichael Wideniusの娘の名前である「My」と、Structured Query Languageの略称である「SQL」を組み合わせたものである。

SANACHAN
SANACHAN
簡単に言うと、データベースです。(そのまま(笑))

 

PHPとMySQL

PHPはサーバーサイドで実行できるスクリプトのため、サーバーで管理しているデータベース「MySQL」などと組み合わせて使用されます。以下のような「PHP+MySQL」を題材とした書籍も多数出版されており、いかにメジャーな使い方であるかが分かるかと思います。


例えば、ユーザーの情報や表示するために必要な情報をデータベースに保存し、アクセスされた時の状態(ユーザー等)やデータベースに蓄積されている内容に応じて動的にHTMLを生成します。

SANACHAN
SANACHAN
私の家計簿アプリだと、各月の各項目の収支をデータベースで管理し、その内容をPHPで出力して表示・編集できるようにしています。

 

PHP5からPHP7の更新で変わったこと

PHPの公式サイトで変更点が分かります。

なんと、そのページのタイトルは「下位互換性のない変更点」。PHP5系からPHP7系の更新により、下位互換性が損なわれた機能の一覧が掲載されています。

SANACHAN
SANACHAN
下位互換とは、古いバージョンとの互換性のことを指します。

 

MySQLに関する内容として、公式ページには以下の記載があります。

ext/mysql のすべての関数が削除されました。
その他の MySQL API の選択肢については MySQL API の選択 を参照ください。

MySQLに関する全ての関数が削除されたようです。

mysql_connect など、今まで使用していた関数がPHP7では使用できなくなったということです。

 

MySQLに関するPHP7で削除された関数

削除された関数の中から、よく利用されている関数を列挙しておきます。

これらを利用しているPHPのコンテンツでは、PHP7に更新の際は動かなくなる可能性があります。

SANACHAN
SANACHAN
MySQLに関するものだけでなく、下位互換を保証していないPHPのバージョンアップは慎重にやる必要がありますね。
  • mysql_connect()
    MySQLのデータベースに接続する関数
  • mysql_select_db()
    接続したMySQLサーバー内のデータベースを選択する関数
  • mysql_query()
    選択したデータベースに対してSQL文を実行する関数
  • mysql_close()
    接続したMySQLデータベースから切断する関数

 

これを見ても分かる通り、mysql_xxxx 関数は「手続き型」の関数であることが分かります。

SANACHAN
SANACHAN
次に紹介する関数は、オブジェクト型です。書き換えるとなると大変そうですね。

 

PHP7で利用可能なMySQLに関する代替え関数

PHP公式ページでは、「MySQL改良版拡張モジュール」を代替え関数として推奨しています。

mysqli というクラスの利用を推奨しているのです。
クラス(オブジェクト型)の利用を推奨しているものの、手続き型の関数(https://www.php.net/manual/ja/ref.mysqli.php)も用意されています。

SANACHAN
SANACHAN
手続き型の関数は、「非推奨」となっています。つまり、将来的に削除される可能性があります

 

mysqlからmysqliへの置き換え対処法

置換の手順は、以下の通りです。

  1. mysqli_xxxx のラッパー関数を用意する
  2. 従来の mysql_xxxx を使用している箇所でラッパー関数を読込む

それぞれ、詳しく見ていきましょう。

 

PHP5で動作するMySQLクラス(mysql_connectなど)

大昔に書いて、なお現役のMySQLのクラスを紹介します。PHP5では動作していました。

スポンサーリンク

mysqli_xxxx のラッパー関数を用意(mysqli_connectなどをwrap)

これをどのように置き換えるか。悩みに悩んだ末、ラッパーの関数群を用意することにしました。

スポンサーリンク

従来 mysql_xxxx を使用していたところでロードする

以下のように記述しておくと、PHP5とPHP7両方で動作するようになります。

SANACHAN
SANACHAN
私のMySQLクラスを使用する場合は、MySQLクラス内とGlobal変数とで、mysql_connect() の戻り値(コネクションのオブジェクト)を2重で保持してしまいますが、そこは気にしない!

 

おわりに

いかがでしたでしょうか。

今回、PHP5系からPHP7系へ更新し、PHPが下位互換を保証していないということを痛感しました。

今後の更新でも、既存関数が削除されることになると思いますので、更新の際は慎重に

以上、「【情報】PHP7でMySQLに関する関数が一新された件」でした。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-PHP
-,