またエラーだよ・・・・
何書いてあるかわからないし私にわかるように説明してほしいなあ
実はエラーもよくみるとわかりやすく書かれているんだよ
え?本当? 私にはさっぱり
私がこのブログでPHPエラーについてわかるように解説するよ。
調べ方も解説するからぜひPHPのエラーと仲良くなって!!
さっそくですがPHPエラーの見方から説明していきます〜
PHPエラーの見方と解決法
まずはPHPエラーの見方を説明します。
PHP はエラーを出して私たちにエラーの内容を伝えているのです。
そのエラーを理解しようとすることが大事です。
エラーのサンプルです
PHP Fatal error: Uncaught Error: Call to undefined function hoge() in /Users/XXXX/Documents/php_study/test.php:4
PHP Fatal error: Uncaught Error: Call to undefined function hoge() in /Users/XXXX/Documents/php_study/test.php:4
PHPのエラーレベルを理解
PHP Fatal error: はエラーのレベルを表しています。
種類は4つあり、上の方がエラーの緊急度が高いです。
Fatal error(致命的なエラー)
Parse error(構文エラー)
Warning(警告)
Notice(注意)
PHP FatalやParse errorの場合正常にプログラムが動いていない、ユーザーにエラー画面等、意図しない画面が見えている可能性があるので早急に対処が必要です。
その他エラーもトラブルを引き起こす原因となるのでリリースまでにエラーが出ないようにしておくことが求められます。
PHPのエラーの内容を理解
Uncaught Error: Call to undefined function hoge()
これはエラーの内容を説明しています。
未定義の関数が呼ばれていますと言っています。
この黄色下線部分の関数名や定数名この場合hoge()を抜いて検索すると、
同じエラーの対処方法が見つかる可能性が高いです。
このエラーの場合 Uncaught Error: Call to undefined function を検索するといいです。
それっぽい検索結果が見つかりました!!
PHPのエラーが起きているファイル名を理解
/Users/XXXX/Documents/php_study/test.php
これはエラーが起きているファイル名を指しています。
PHPのエラーが起きている行数を理解
4
これはエラーが起きている行数です。
以上エラーログの見方を説明しました。
今は呪文のように見えるかもしれませんが、エラーを見ているうちに徐々に慣れてきます。
エラーログを見て、調査&検索して問題解決していきましょう。
続いてはPHP のエラーについて各エラーと対処方法をお伝えします。
PHPエラーの種類
PHPのエラーは大きく4種類あります。
- Fatal error(致命的なエラー)
- Parse error(構文エラー)
- Warning(警告)
- Notice(注意)
上から重大なエラーで、Fatal errorとParseエラーは処理を中断します。
Warning、Noticeは処理を継続しますが、バグの原因になるなど、意図しない動きをしている可能性もあリます。
必ず直しておいた方がいいです。
続いては各エラーの詳細説明と、エラーの解決方法についてお伝えします。
Fatal Error(致命的なエラー)
Fatal Error、PHP の処理が止まってしまうほどの重大なエラーです。
原因
- 存在しない関数を呼び出し
- 関数の二重定義
同じ関数を2回定義したり、定義されていない関数を呼び出すことはできません。
解決法
同じ関数名を使ってしまっていた場合は関数名を変更しましょう。
定義されていない関数を使ってしまっていた場合、関数名を再度チェックしましょう。
サンプルコード
存在しない関数を呼び出した場合は下記のようなエラーが出ます。
Fatal error: Uncaught Error: Call to undefined function test() in /Users/xxxxxx/Documents/php_study/test.php:3
Stack trace:
#0 {main}
thrown in /Users/xxxxxx/Documents/php_study/test.php on line 3
Call to undefined function = 定義されていない関数が呼ばれていますという意味です。
・関数を2重定義した場合は
このようなエラーが出ます。
Fatal error: Cannot redeclare test() (previously declared in /Users/xxxxxx/Documents/php_study/test.php:10) in /Users/xxxxxx/Documents/php_study/test.php on line 19
エラー文を見ると
Cannot redeclare test() (previously declared in /Users/xxxxxx/Documents/php_study/test.php:10)
既に10行目で同じ関数が定義されていますよという意味です。
関数名を変更しましょう。
全く同じ処理をする関数が複数存在するのはよくないので、念の為同名の関数の用途、コード等は確認しましょう。
Parse error (構文エラー、文法エラー)
Parse error(構文エラー、文法エラー)です。こちらもPHPの処理が中断してしまう影響度の高いエラーであります。
一度ハマってしまうとなかなか抜け出せないエラーの一つです。
カッコやセミコロン;忘れなど単純ミスが原因のことが多いです。
解決法
エラーログが示している行数、行数より前を見てダブルクオートやカッコの閉じ忘れ、セミコロン;漏れがないか確認。
問題はだいたいエラーより前の行数で起こっています。
ネットや他のファイルからコピペしてきたら
最後の行や最後の文字になりやすいカッコやセミコロンをコピーし忘れてエラーになったということはよくあります。
コピペミスがないかも確認しましょう。
まだ前の処理カッコ閉じてないのに次の処理きちゃってて処理できないみたいな感じでしょうか。
Fatalエラーと違って調査の対象が広くなります。
エラー行数より前もよくみましょう。
サンプルコード
サンプルコードで見てみましょう。
Parse error: syntax error, unexpected ‘}’, expecting ‘,’ or ‘;’ in /Users/xxxxxx/Documents/php_study/test.php on line 7
6行目の最後にセミコロンが抜けています。;
がエラーログでは7行目がおかしいと出ています。
ハマってしまうとなかなか抜け出せないので、
どこが原因かわからない場合は書いたコードをどこかにコピペしておいて、
再度書き直してみることをおすすめします!
Warning(警告)
Warning(警告です)
あるべき値やファイル、DBなどのリソースが取れない時に発生します。
大体PHP側でデータがない時と同じ値を入れて処理を継続します。
動きはしますが、意図しない値で処理が継続されていることがあるので修正が必要です。
解決法
処理内容の変更が必要な場合が多いです
- 事前にファイルや値が存在することをチェックする関数を使い、存在するときのみその関数を使う。
- 処理に使う関数を変える
変数であればisset()
配列のキーの存在チェックの場合はarray_key_exists()
ファイルであればfile_exists()
の関数などが便利です。
サンプルコードです。
ファイルの存在チェックを入れてWarningを回避しています。
※sample.txtは存在しません。
エラー内容
Warning: file_get_contents(sample.txt): failed to open stream: No such file or directory in /Users/XXXXX/Documents/php_study/test.php on line 3
(sample.txt): failed to open stream: No such file or directory in
sample.txtがないというエラーです。
このコードの対処法としては、
・ファイル名が正しいかチェックをする
・ファイルの存在する時だけ処理をする
file_existsというファイルの存在をチェックしてくれる関数があるのでそれを事前に使います。
ファイルが存在する場合のみfile_get_contentsの関数を使うことでWarningがなくなります。
ファイルの存在チェックをすることで、
取得データがない時にファイルがなくて取得データがないのか、
ファイルがあって取得データがないのかその時の処理の状況もよくわかるようになるので運用上やさしいコードが書けます。
Warningが出るということは関数の使い方が正しくない場合も多くありますので、
今一度正しい関数の使い方をしているかどうか確認してみてください!
Notice(通知)
定義していない変数を使うときによく出ます。
特にとってきたデータが空だった時の処理をしていなくて起こりやすいです。
解決法
- 変数のスペルミスでないことを確認
- 変数を定義
サンプルコードです。
変数とキーが未定義の時に出るエラーです。
実行時のエラーです
PHP Notice: Undefined variable: test1 in /Users/XXXXXX/Documents/php_study/test.php on line 3
3行目で使ってるtest1の変数が定義されていないと言っています。
PHP Notice: Undefined index: fruits in /Users/XXXXXX/Documents/php_study/test.php on line 10
10行目で使ってるfruitsってindexは定義されていないと言っています。
NoticeはWarningと同様エラーでも動きますが、エラーが出ないように対処しておくと良いです。
対処方法
変数の場合(Undefined variable)
isset関数を用いて変数が定義されているかどうか確認
使う前に変数を使う宣言をする
宣言をしてあげることでこの変数にはどういうデータが入ってくるかわかるのでソースの可読性も上がります。
配列のキーの場合(Undefined index)
配列の要素がない場合とある場合で処理を分ける
以上PHP4つのエラー種類とその意味、そして対処法について説明しました。
ごくごく代表的なエラーをご説明しただけなので、私が困っているエラーとは違う!!と思っている方もいらっしゃるでしょう。
そんなあなたへ次はGoogleで検索する方法を説明します。
先にもお伝えしましたが、Google検索すると他の人が書いてくれた解決法がたくさん載っています。
ぜひGoogleでの検索方法もマスターしてエラー解決への近道としてください。
Google検索でPHPエラーを解決する最適検索ワード
さて、Googleで検索して答えを見つけるには、検索ワードにこだわる。
最適な検索ワードを見つけるに限ります。
ここでは検索ワードの決め方を説明していきます!!
何のワードを検索したらいいのか
まず、エラーログを出してみます。
上記のサンプルで用いた時に出たエラーを使います。
Parse error: syntax error, unexpected ‘}’, expecting ‘,’ or ‘;’ in /Users/xxxxxx/Documents/php_study/test.php on line 7
これをエイヤーと検索ボックスに入れてみても意図するものはヒットしません。
Google検索さんも頑張って結果を表示しているみたいですが、ちょっと求めているものとは違いそうです。
これはファイルパスや行数などこのコードの環境特有の情報が検索ワードに含まれているためです。
みんなが困っていると思われるワードを検索しないとヒットしません。
なのであなたの開発している環境特有のものを検索対象から削除します。
環境固有もの
- 変数名
- 関数名
- ファイルパス
- 行数
※ただしLaravel等フレームワークを用いた開発の場合、
フレームワークを使っている人の中では共通しているものになるので検索対象に含めることもあります。
余談になりますがパスや行数を検索対象に含めた場合、
パスにあなたのプロダクト名が含まれていることもあり公開されてはよくない情報が検索履歴に残ってしまう場合があります。
特に商用プロダクトを開発している場合などはパスや行数を含んだ状態で検索ボックスに入れないことをおすすめします。
さて環境固有のものを検索対象から消していきましょう。
Parse error: syntax error, unexpected ‘}’, expecting ‘,’ or ‘;’ in /Users/xxxxxx/Documents/php_study/test.php on line 7
後半部分 /Users/XXXXXXX/Documents/php_study/test.php on line 7
あなたのソースコードのパスと行数はあなた固有のものですね。
これを含めて検索しても意図した検索結果は出てこないでしょう。
ですので、
黄色の下線が引いてある部分はあなたの環境固有の情報ということで、検索対象から削除します。
Parse error: syntax error, unexpected ‘}’, expecting ‘,’ or ‘;’ in /Users/xxxxxx/Documents/php_study/test.php on line 7
↓
Parse error: syntax error, unexpected ‘{‘ in この部分が残ります。
ではこれを検索してみましょう!
さっきよりは近いものが検索結果に出てきたと思います。
上から順にのぞいてみると1番目のサイトにそれっぽいことが書いてあります。
https://itrice580.com/2019/10/18/php-5/
セミコロン忘れの可能性があるみたいです。
ソースコードを見てみましょう
今回問題のコードはまさに6行目の最後のセミコロン忘れなので合致しました!!
これでセミコロンをつけてみて解決です。
こんなふうに自分の環境固有のものそうでないものを
分けて固有のものは検索対象から外して検索するとうまくヒットします。
検索結果は関連するものから上に並んでいるので、
もし1ページ目終わっても良さそうなものがなければ検索ワードを増減してみてチャレンジしてみてください。
PHPエラーのチェック、表示方法
php.iniで設定する
display_errorsの設定値を変える
PHP エラーを表示させる
display_errors = ON
PHP エラーを表示させない
display_errors = OFF
すでにdisplay_errors の設定項目はphp.iniにあるのでON、OFFを切り替えましょう。
変更後はWebサーバーの再起動をして反映完了です。
※本番環境ではユーザーにエラーが見えるのはよくないので必ずOFFにしましょう。
※php.iniはPHPを動かす大事なファイルなので編集ミスによりシステムが動かなくなる可能性があります。
編集時は必ずバックアップを取ってから作業しましょう。
ini_setを使いphpファイル内で設定する
設定方法
エラー表示あり
ini_set(‘display_errors’, 1);
エラー表示なし
ini_set(‘display_errors’, 0);
設定する際はPHP ファイルの上部に記載します。
ログファイルでの確認方法
ログファイルにPHP を書き込んで確認する方法を説明します
まずはログファイルの場所を確認しましょう。
LinuxやMacの場合
ターミナルで
php --info | grep error_log
Windowsの場合
コマンドプロンプトで
php --info | findstr /r /c:"error_log"
エラーログファイルパスが確認できたらファイルを開きましょう
エラーログ確認できましたか?
PHPエラーを減らすために
最後にそもそもPHP のケアレスミスを減らすための方法をお伝えします。
ズバリ
- PHP のシンタックス(文法)に対応したエディターを使う
EclipseやVisual Studio Codeあたりが有名でしょうか。
PHP に対応したエディターを使うとコーディングしながらリアルタイムにエラーを教えてくれます。
特に解決するのに時間がかかりやすいSyntax errorには効果あります。
また関数や変数の保管機能を使えばあれ?新規だっけとかもう同じ関数あるじゃんとか気付くことができ、
Fatalエラーの関数未定義、関数の二重定義のエラーも未然に防げます。
図では$tesと変数名をうっているとすでに定義済みの$test,$test1が出てきています。
このようにエディターでPHP のシンタックスを有効にするとさまざまなエラーを軽減することができます。
セットアップは少し手間ですが、開発中にエラーを解決する方が手間なのでぜひ導入してみてください!!
終わりに
このページでは主にPHP のエラーの見方、検索方法について解説しました!!
特にプログラミング初心者にはエラーを解決するのが大仕事でしょう。
初めは検索しても、検索結果に書いてあることがよくわからないと思うこともあるでしょうが、
必ず続けていると慣れてくるので諦めないでください。
同じエラーに15分くらい詰まったら、一旦休憩する。
それでも解決できなければ同僚、いなければTwitterやTeratailなどに質問してみてください。
以上です。最後までお読みいただきありがとうございました。