
PHP7版へsql文の修正を伴うサーバー移転(Xserver)
PHP7の環境に旧バージョンのシステムを移設した際に様々なエラーが出る場合があります。
PHP7では「mysql_関数」系が使えない事がメインのエラー要因です。
今回はPHPの標準モジュールである「MySQLi関数」に各箇所を置き換えて対処しています。
mysqliの拡張モジュールを使ったPHP7版コード修正
本記事は、エックスサーバー(PHP7の環境)へオリジナルのシステムを移設した時に吐いていたエラーを解消するためのメモ記事です。
基本的には全て「mysqliの拡張モジュール」を使った対処となります。
問題にぶち当たる事は実力を伸ばします
構成されたシステムによって当然修正内容が違ってきますので、あなたが遭遇したケースに100%マッチしないかも知れません。
しかし必ず重なるところがあると思いますので、是非参考にして頂ければと思います。
PHPは難しくやった事がないからと諦めずに、この記事を参考にエラーを解消できるよう頑張ってみて下さい。
実力UP・PHPの勉強意欲につながるかも知れません。
※今回はあくまで応急措置であり、エラーを吐かなくさせる方法に留めていますので完璧な対処ではありません。
サーバー移転案件の概要
今回はXserverへのWordpressシステムサイトの移転と、オリジナルのNEW情報更新システムの移設を担当した案件紹介です。
移転元はレンタルサーバーのコントロールパネルではなく、別のWEBサイトを示すIPアドレスとログイン情報で接続しました。
※アドレスは行政書士事務所のWEBサイトでした。
ポイント:PHP7のバージョン差でシステムにエラーが出ている
移転先はエックスサーバーであり、Wordpressシステムの移転は問題なく完了しました。
ところがサーバー内に「見知らぬ構成ファイル」を見つけた事で、問題が発覚します。
それはWordpressとは別にphpとMySQLで構築された、新着情報記事の更新システム(以下:NEWSシステム)でした。
PHP7のバージョン差によりNEWSシステムにエラーが出ていて、このままでは動きません。
本記事では、PHP7バージョンへの修正対応をどのように進めたかを中心に解説します。
※NEWSシステムは専用の管理画面から、新着情報としてタイトルやテキストおよび画像ファイルがアップできるものです。
別案件の受注を前提に格安で対応
クライアントからはこのシステムの説明がなかったので、当初の見積書には含んでいませんでした。
追加見積の打診をしましたが、あまり予算がないのでできるだけ安くして欲しいとクライアントから申し出があります。
クライアントが予定している他サイトの移転案件もお願い頂くという条件で、格安対応する事になりました。
PHPコードの修正ポイント
PHP7バージョンに合わせるという事は、今までのコードをPHP7で許可される表現(書き方)に変える事を意味します。
それまではOKだった書き方が、PHP7では許されていないものがたくさんあるのですね。
PHP7の環境にシステムを移設した時にエラーが出ていたコード部分(構文)は、主に以下の項目でした。
対象となる主なエラー箇所
mysql_connect();
mysql_select_db();
mysql_query();
mysql_fetch_array();
lengthプロパティ
繰り返しとなりますが、今回はあくまでも応急措置による修正です。
本来であればもっと正確で正しい修正方法を実施するべきですが、とにかくエラーを吐かなくなる対処のみに留めています。
本来ベストな修正作業ではありませんのでどうぞご了承下さいませ。
DBファイル
NEWSシステムに使用されるDBテーブルは、Wordpressに使われているMySQLテーブル群と同じところに入っていました。
このテーブル群も、DBデータのインポート・エクスポート時にwp_関連のテーブルと一緒に移しています。
このNEWSシステム用のDBテーブルは移動させただけで、中には一切触っておりません。
MySQLiクラスを使った修正
MySQLiクラスは、PHPからMySQLデータベースサーバーへ接続を行うための拡張モジュールです。
PHPに標準で同梱されているMySQLのネイティブな機能の1つになります。
実質的にPHPのver5.5以降から、以下より登場する様々なmysql_系関数一式が使えなくなっているのですね。
エラーはmysql_系関数に集中していますので、「mysql_」を「mysqli_」として処理していきます。
以下より表示エラーコードを例に挙げつつ、その対処方法をご紹介していきます。
Fatal error: Uncaught Error: Call to undefined function mysql_connect()…
このエラーが出ている場合、システムの根幹となるデータベースへの接続ができていない事を示しています。
まずはシステム構成の中で「DB接続をするファイル」を探しましょう。
DB接続ファイル内コード
$con = mysql_connect('ホスト名','ユーザー名','パスワード') or die("DBがありません!");
修正コード
mysql_connect → mysqli_connect…
今回は上記記述のmysql_connectに「i」を足してmysqli_connectとしています。
mysqlに「i」を追記するだけでDBに接続できるはずです。
中身のホスト名やユーザー名、パスワードなどの引数は移転先(ここではXserver)の情報に変更する必要がありますね。
$con = mysqli_connect('ホスト名','ユーザー名','パスワード');
本来理想とする修正案
ここまで「i」を付けるだけで処理しましたが、本来は下記の様に全て書き換えるのが普通です。
$mysqli = new mysqli('ホスト名', 'ユーザー名', 'パスワード', 'データベース名'); if ($mysqli->connect_error) { die('Connect Error', $mysqli->error); }
Fatal error: Uncaught Error: Call to undefined function mysql_select_db()…
このエラーが出る場合、mysql_select_db定義関数が呼び出せない事を示しています。
ここは先ほど同様に、mysql_select_db();に「i」をつけて、mysqli_select_db();にしてみましょう。
mysqli_select_db('データベース名', $con) or die("DBがありません!");
上記のmysqli_connectとあわせてmysqli_select_dbにする事で、Fatal errorが解消されるはずです。
Fatal error: Uncaught Error: Call to undefined function mysql_query()…
このエラーもmysql_connect時と同様、mysql_query()が使えない(関数が無い)事を指しています。
ですのでまずは、mysql_query()をmysqli_queryにしてみましょう。
mysqli_query($sql);
するとFatal Errorは解消されると思いますが、代わりに次の様なエラー(Warning)に変わると思います。
Warning: mysqli_query() expects at least 2 parameters, 1 given in…
これはmysqli_query()には少なくとも「2つの引数」を使わなければならないという意味です。
実際のコードでは、ここはmysqli_query($sql)となっていました。
このように()内の引数が1つしかないので、「最低もう一つ必要ですよ」とエラー表示が示しています。
そこで以下の様に変更します。
DB接続リソースと結果セットを入れる
mysqli_query($con, $sql);
中に2つの引数を入れていますね。
修正コードの解説
この$sqlはどのような命令文であろうと、基本的にはDBのテーブルデータへ接続する事が前提の命令です。
DBへの接続リソースは、一つ前のmysqli_connect();の構文で$conに代入されていますので、$conを第一引数に入れています。
$con = mysqli_connect('ホスト名','ユーザー名','パスワード');
この様にmysql_queryには、「DBへの接続リソース」と「$sqlなどの結果セット」の指定が必要です。
DB接続リソースを各ファイルで共有する場合
一つ前のエラーは、DB接続リソースが代入された$conを第一引数として使いました。
しかしこのmysqli_query();は様々なところで出現します。DB接続ファイル上だけはありません。
その他すべてのphpファイルで、mysqli_query($con, $sql);の様な形にする必要があります。
そのためには、他のphpファイルでも同様に$conを第一引数として使える必要がありますね。
DB接続ファイルのインクルード
通常DBへ接続する構文は、専用ファイル(DB接続ファイル)に1回書くだけです。
他の箇所で毎回mysqli_connect();を書かなくていい様にするのがセオリーですよね。
そのために各構成ファイル冒頭で、このDB接続ファイルを読み込み(インクルード)する訳です。
こうしておけばDB接続準備はいつでもできている事になりますし。仮にDB接続先が変わっても、DB接続ファイル1か所を修正するだけで済みますよね。
インクルード記述
include_once("config/db_connect.php"); //db_connect.php がDB接続リソースファイルの場合
DB接続ファイルの$conをglobalで参照する
今まではこのファイルのインクルードでDB接続ができていた訳ですが、PHP7ではもう少し厳格になった事がわかります。
DB接続リソースの引数が必要になるのですから、どのファイルでも$conが必要です。
include_once("");でDB接続ファイルを読み込むだけではこの$conが機能しないので、以下の様に運び込んでくる必要があるのです。
global $con; mysqli_query($con, $sql); …
global関数を使って読み込む
globalは他のファイルの要素を持ってくる命令と考えて下さい。
この様に書いておくことで、DB接続ファイルで代入した$conを別ファイル内でも自由に使う事ができる訳です。
これにより全てのPHPファイルで、mysqli_query($con, $sql);とする事ができます。
Fatal error: Uncaught Error: Call to undefined function mysql_fetch_array()…
これは、sqlによるデータ結果を取得する命令文の際のエラーです。
この構文の前には、必ずmysqli_query();の構文があるはずです。
mysqli_queryを修正しているのであれば、mysql_fetch_arrayは「i」の追記のみで済みます。
mysql_fetch_array修正コード
$item = mysqli_fetch_array($rs);
Warning: Use of undefined constant length - assumed 'length'…
これはPHP7では「lengthプロパティが未定義ですが、lengthと推測しています。」という事を指しています。
該当するのは以下の様な箇所ですね。
if ($Name.length > 0){ //$Nameの長さが0ではない時の処理文 }
そこでlengthを'length'とシングルクォーテーションで囲いました。
length修正コード
if ($Name.'length' > 0){}
すると警告は出なくなりました。
別関数で置き換えする場合
場合によってはこれでも動かないケースがあるかも知れません。
その時は文字列をカウントする別の関数に差し替える必要がありますね。
例えば以下の様な構文です。
if (Count($Name) > 0){ //$Nameの長さが0ではない時の処理文 }
XserverでPHPのエラーを表示させない様にする方法
Warningのエラーが出る場合、エラーは吐きますがシステム自体は正常に動く場合があります。
とりあえずエラー表示だけをなくしたい場合は、コントロールパネルで設定をする事ができます。
Xserverのサーバーパネルへ進み、メニューの中から「php.ini設定」を探します。
次にエラー表示をなくしたいサイトドメイン名を選択します。
エラー設定の「display_errors」の欄を「OFF」にしましょう。
ページ一番下にある「確認画面へ進む」をクリックします。
display_errorsがOFFになっている事を確認して、下にある「変更する」を押せば設定完了です。
まとめ
本案件でPHP7の環境で発生していたエラー箇所をまとめました。
mysql_connect();
mysql_select_db();
mysql_query();
mysql_fetch_array();
lengthなどの未定義プロパティ…
上記以外のエラーでも、エラーコードをコピペして調べれば他サイトでも出てくるはずです。
2行あったエラーコードが1行になったり0になった時の感動、湧き上がる喜びは皆さん共通です。
諦めずにトライした事が貴方の実力UPにつながります。ぜひ頑張ってみてください。