エラーの意味とその対策

トップ > PHP入門 > エラーの意味とその対策

目次

広告

WADAX
安心の365日電話サポート付きレンタルサーバーです。
ロリポップ!
月額263円からのレンタルサーバー。マニュアルも充実しています。

エラーの表示について

PHPはプログラムにエラーがあった際、画面にエラー内容を表示することができます。表示するエラーの内容は、php.ini で設定することができます。具体的には、514行目にある

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED

この部分で設定することができます。この部分を以下のように修正すると、すべてのエラーと警告を表示します。(厳密には、PHP5では「コードの相互運用性や互換性を維持するための提案」が表示される E_STRICT が含まれませんが、PHP6からはこれも含まれるようになります。)

error_reporting = E_ALL

以降のサンプルプログラムは、このように設定されているものとして解説しています。

エラーの意味とその対策

エラーの表示について

プログラムにエラーがあった際、画面にエラー内容とエラーが発生した場所が表示されます。例えば

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>サンプル</title>
</head>
<body>
<p><?php

eche "こんにちは。<br />\n";	//echoのスペルを間違えている
echo "PHP の世界へようこそ!";

?></p>
</body>
</html>

このプログラムを実行すると、以下のエラー(Parse error)が表示されます。Parse error は、プログラムを実行できない致命的なエラーがあった場合に表示されます。

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\xampp\htdocs\test.php on line 9

英語の詳しい意味が解らなくても、test.php on line 9 という部分で「test.php の9行目でエラーがあった」ということが読み取れます。今回は9行目にある echo のスペルが間違っているため、このようなエラーが表示されています。

このように、PHPがエラーの内容を教えてくれるので、効率的にプログラムの開発と修正を行うことができます。

エラーの発生場所について

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>サンプル</title>
</head>
<body>
<p><?php

echo "こんにちは。<br />\n"	//最後にセミコロンを付け忘れている
echo "PHP の世界へようこそ!";

?></p>
</body>
</html>

このプログラムを実行すると、以下のエラーが表示されます。

Parse error: syntax error, unexpected T_ECHO, expecting ',' or ';' in C:\xampp\htdocs\test.php on line 10

10行目に問題があると表示されていますが、実際に問題があるのは9行目です。

PHPは「セミコロンで命令を区切る前に、次の命令を書いた」という時点で問題があるとみなしているため、エラーの場所が10行目となっています。このように解釈されるため、実際に問題のある行とは異なる行番号が表示されることがあるので注意してください。大抵の場合、表示されている行番号かそれより前に問題があります。

もう一つ例を挙げます。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>サンプル</title>
</head>
<body>
<p><?php

$sample = 10;

if ($sample > 5) 	//カッコの開始を書き忘れている
  echo "変数sampleの内容は5より大きいです。";
} else {
  echo "変数sampleの内容は5より小さいです。";
}

?></p>
</body>
</html>

このプログラムを実行すると、以下のエラーが表示されます。

Parse error: syntax error, unexpected '}' in C:\xampp\htdocs\test.php on line 13

13行目に問題があると表示されていますが、実際に問題があるのは11行目です。

「カッコの開始がないのに、カッコを閉じている」という時点で問題があるとみなしているため、エラーの場所が13行目となっています。カッコの書き忘れによるエラーは、実際に問題がある行と大きく異なる行を報告されることが多いので、注意してください。

Warning

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>サンプル</title>
</head>
<body>
<p><?php

$fp = fopen("xxx.txt", "r");	//ファイルが存在しない場合
while ($line = fgets($fp)) {
  echo "$line<br>";
}
fclose($fp);

?></p>
</body>
</html>

このプログラムを実行すると、以下の警告(Warning)が表示されます。Warning は、プログラムを実行できるもののエラーがあるという場合に表示されます。

Warning: fopen(xxx.txt) [function.fopen]: failed to open stream: No such file or directory in C:\xampp\htdocs\test.php on line 9
Warning: fgets() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\test.php on line 10
Warning: fclose() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\test.php on line 13

存在しないファイルを開こうとしているために9行目で警告が表示されていますが、さらに10行目と13行目でも警告が表示されています。これはファイルを開けなかったために、ファイルの内容を読み込む fgets や、ファイルを閉じる fclose も正しく実行できないためです。

このように、一つのエラーが他のエラーを誘発させることがあります。たくさんのエラーが表示さされる場合、最初の一つを解決すれば他のエラーも解消されることが多いです。

Notice

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>サンプル</title>
</head>
<body>
<p><?php

echo $test;	//利用されていない変数の内容を表示しようとしている

?></p>
</body>
</html>

このプログラムを実行すると、以下の注意(Notice)が表示されます。Notice は、エラーを発生しうる状況にある場合に表示されます。

Notice: Undefined variable: test in C:\xampp\htdocs\test.php on line 9

利用されていない変数の内容を表示しようとしたので注意が表示されています。Parse errorWarning に比べれば致命的な問題ではありませんが、利用されていない変数の内容を表示することは普通ありません。ですので「もしかしてプログラムのミスではありませんか?」と、PHPが注意を表示してくれています。

なお、Noticephp.ini の初期設定では表示されません。ですが変数のスペルミスによる誤動作を防ぐことができるため、表示するようにしておいた方がいいでしょう。

エラーの抑制

エラーが表示される処理の直前に @ を付けると、エラーの表示を抑制することができます。例えば

$fp = @fopen("xxx.txt", "r");

このように書くと、ファイルが存在しない場合でも警告が表示されなくなります。同様に、

echo @$test;

このように書くと、利用されていない変数の内容を表示しようとしても警告が表示されなくなります。

@Parse error のエラーを抑制することはできませんが、WarningNotice によるエラーメッセージを部分的に非表示することができます。

ただし @ を使用すると必要な情報が表示されなくなるので、基本的に使用しないようにしましょう。@ を使わなくてもエラーが表示されないプログラムにすることをお勧めします。