プログラミング中に起きたエラーは「エラーログ」を確認することでほとんど解決します。
エラーログというと、こんな感じです。
うわっ…なんだこれ、どうやって見るんだ、わかる気がしない
と、初めてみるとこう感じるかもしれませんが、実は簡単です。
エラーログは、
- どのファイルの何行目に問題があるのか教えてくれる
- どのような原因でダメなのか教えてくれる
この2つを教えてくれるので、問題解決のほぼ答えを知ることができます。
それでは、
エラーログの出し方と、こうやって読むと簡単に理解できるよという内容を紹介してみます!
エラーログの出し方
まずはエラーを出すために、文法的に間違ったコードを用意しておきます。
<?php
$name = "徳川家康";
echo $togugawa;
?>
「$name」という変数を定義しているのに、
「$togugawa」という謎の変数を出力しようとしていますね。
普通に考えると、
$tokugawaって、どこから出てきたんですか…?それ
という感じですよね。
続いて、エラーを出すためには、ブラウザを更新する必要があります。
しかし、画面を更新しても何も表示されません。
まぁ、出力するものが無いのですから、それはそうですよね。
画面上には何も動きはありませんが、内部的には
「$tokugawa」っていうよくわからない変数指定されたぞ!
というエラーで大慌てです。
では、そのログを表示していきましょう!
エラーログの表示する方法
Macならターミナル、Windowsならコマンドプロンプトで確認できますが、
今回はVSCode上で行っていきます。
画面上部の「ターミナル」→「新しいターミナル」をクリック
するとターミナル/コマンドプロンプトと同じものをVSCodeで表示できるので、次のように入力してエンターを押します。
Macの方
tail -f /Applications/MAMP/logs/php_error.log
Windowsの方
tail -f /c/xampp/php/logs/php_error_log
結果
[01-Aug-2021 09:57:13 Asia/Tokyo] PHP Notice: Undefined variable: togugawa in
/Applications/MAMP/htdocs/sample1/index.php on line 3
このエラーの意味と読み方については、少し後で解説します。
エラーログの止め方
ターミナル/コマンドプロンプトを開くと、
自分の名前 + 現在編集中のファイルの位置 + $
このような表示になっているかと思います。
しかし「tail -f」コマンドを使ってエラーログを表示すると、この表示が消えています。
基本的には、
自分の名前 + 現在編集中のファイルの位置 + $
この形になっていると正常モード。そうでなければ、何か別の機能が実行中。
というようなイメージです。
今、「エラーログ表示モード」になっているので、これを切断してあげる必要があります。
使うコマンドは、
「Ctrl + c」
これで停止することができます。
仕組みの解説
特に何の説明も無しに、
「tail -f /Applications/MAMP/logs/php_error.log」
と入力してください。と進んでしまいましたが、まずこれの意味についてです。
tail -fコマンド
「tail -f」を先頭につけることで、今からエラーログを確認するという指定をする事ができます。
/Applications…php_error.logについて
エラーログが表示される。
ということは、どこかにそのエラーログを管理しているファイルがあるという事です。
その場所が、
「Applications」フォルダの中の「MAMP」フォルダの中の「logs」フォルダの中にある「php_error.log」ファイルです。
何かエラーがあると、この「php_error.log」の中に書き込まれていきます。
その「php_error.log」を実行しているというコマンドですね。
色々書いてきましたが、
「tail -f /Applications/MAMP/logs/php_error.log」
と書くと、エラーログを確認できると覚えておいてください。
(忘れてしまったら調べれば一瞬で出てくるので、暗記しておかなくても大丈夫です)
よく出るエラーとその修正方法
エラーの種類はたくさんありますが、
なんだかんだでよく出るエラーは限られています。
いくつかパターンを知っておくと、
あぁ、これか。
という感じで一瞬で修正できます。
具体的に紹介しておきます!
PHP Notice: Undefined variable
ちょうど先ほど出たエラーの解説です。↓
PHP Notice: Undefined variable: togugawa in
/Applications/MAMP/htdocs/sample1/index.php on line 3
- 「Undefined variable: tokugawa 」について
「Undefined」は定義されていない。「Variable」は変数という意味です。
つまりそのままの意味で「定義されていない変数tokugawaが使われていますよ」というエラーです。 - 「in /Applications/MAMP…」について
「tokugawa」という変数がどこのファイルにあるのか、その階層を示しています。
「Applications」フォルダの「MAMP」フォルダの「htdocs」フォルダの「sample1」フォルダの中にある「index.php」という事ですね。 - 「on line 3」について
これは単純で、何行目にあるか教えてくれています。
まとめると、
「index.phpの3行目にtokugawaという定義していない変数が使われていますよ」
という意味になります。
PHP Notice: Undefined offset
今度は、次のような間違いのコードを使ってみます。
何が間違っているのかわかりますか?
<?php
$numbers = [10, 20, 30];
echo $numbers[3];
?>
「tail -f」コマンドで確認してみましょう。
PHP Notice: Undefined offset: 3 in
/Applications/MAMP/htdocs/sample1/index.php on line 3
「index.phpの3行目に定義していない 3という何かがoffsetされています」
と、ちょっとわかりづらいですね。
まず、コードを見てください。
$numbers = [10, 20, 30];
と定義しましたが、出力するのは$numbers[3]と指定されています。
インデックスを3と指定すると「0, 1, 2, 3」番目、つまり左から数えて4番目の値にアクセスしようとしていることになります。
→ 無いですよね。4番目の値って。
配列の中身は3つしか無いのに、4番目にアクセスしようとしている状況です。
「Undefined offset: 数字」と来たら、
配列の◯番目にアクセスしようとしてるけど、それは存在しないですよ。
という意味ですね。
PHP Parse error: syntax error…
続いてこのエラーを出すために次のコードを準備してください。
<?php
$age = 20;
if($age === 20) {
echo '成人です';
} else {
echo '未成年です';
}
?>
多分、書いた時点でVSCodeにエラーの波線が引かれるので実行する前に気づくと思いますが、これは間違いです。
エラー文を見てみるとこうなります。
PHP Parse error: syntax error, unexpected ';' (T_STRING), expecting ';' or ',' in
/Applications/MAMP/htdocs/sample1/index.php on line 6
まず「syntax error」ですが、これは「構文エラー」です。
例えば、if文やfor文の書き方自体を間違えているため絶対に動きませんよというものです。
「unexpected」は予期しないという意味です。
本来、PHPが想定していたものと別のものが記述されているという感じですね。
画面を更新すると、今までとは違って画面すら表示されなくなりました。
エラーメッセージを読み解いてみると、
「unexpected(予期しない)「;」来ています。
expecting(想定していたのは)「;」か「,」です」
ちょっとわかりづらいですが、
セミコロンが大文字になっているから
というのが間違いの答えになります。
まとめ
- Mac:「tail -f /Applications/MAMP/logs/php_error.log」
- Windows:「tail -f /c/xampp/php/logs/php_error_log」
- エラー表示モードを止めるときは「Ctrl + c」
- 「Undefined variable」:定義していない変数を使おうとしていますよ
- 「Undefined offset」:配列の数の限界を超えた値にアクセスしようとしてますよ
- 「syntax error」:PHPの文法上の書き方が間違っていますよ