[PHP]よくあるエラーメッセージの原因と対処法 1

Pocket

プログラミングにエラーはつきものですが、エラーメッセージの意味がわかっていれば素早く対処出来ます。

そこで、よくあるエラーメッセージと、それが起こる具体例をいくつかまとめてみました。


Notice: Undefined variable: (変数名)

<?php
echo $a;

「変数が定義されていません」という意味で、例では変数 $a を初期化することなくいきなり
echo しようとしたために起こるエラーです。

こんな単純なミス絶対しないと思うかもしれませんが、次のようになっていたりすると
案外見落としてしまうかもしれません。

<?php
$sample = "red";

if( $sample == "blue" ){
  $a = "OK";
}

echo $a;

条件分岐で真ならば変数 a を定義するようになっているため、条件に合わなければ $a は初期化されません。
あらかじめ初期化するか、else の中で定義することで解決します。


Parse error: syntax error, unexpected end of file, expecting ‘,’ or ‘;’

<?php
echo "hello"

あるべき文字が抜けている場合などに起こる構文エラーです。
この場合は行末のセミコロンがありません。
「unexpected end of file」の部分はエラー箇所の次の処理が入るので、
「unexpected ‘echo’ (T_ECHO)」のようなメッセージになる場合もあります。
セミコロンを入力したつもりがコロン(:)だったということもしばしばです。

<?php
$sample = "ok";

if(isset($sample){
  echo $sample;
}

上の結果は「Parse error: syntax error, unexpected ‘{‘」です。
わかりにくいですが、if の丸括弧を閉じ忘れています。
他にも function() の「{}」の数が合わない場合などが考えられます。
このエラーが起きたときは、セミコロンがきちんと付いているか、括弧は閉じられているかを
よく確認して下さい。


Fatal error: [] operator not supported for strings

<?php
$var = "test";
$var[] = "sample";

変数を文字型として初期化したにもかかわらず、配列として扱おうとしています。
ちなみに数値型などで初期化していた場合は
「Warning: Cannot use a scalar value as an array」
のようになります。


Fatal error: Call to undefined function (関数名)

<?php
my_function();

定義していない関数を呼びだそうとして起こるエラーです。
関数の書かれた別ファイルを include し忘れていることが多いです。
あるいは PEAR や ImageMagick などのライブラリがインストールされていないかもしれません。
PHP のバージョンアップで今まで使えていた関数がなくなっていることもあります。


Warning: Missing argument 2 for (関数名)

<?php
function my_function($a, $b){
	echo $a + $b;
}

my_function( 100 );

関数に必要な引数が省略されている場合に起こりうるエラーです。
例の関数は2つの変数の合計を表示するように作られていますが、
二番目の引数(argument 2)を書いていないので、変数 $b が欠落しています。

もし省略可にするのであれば関数に初期値を設定しておくべきです。

function my_function($a=0, $b=0){}

Notice: Constant (定数名) already defined

<?php
define('TEST', 100);
define('TEST', 200);

同じ名前の定数は一度しか定義できません。
一度 TEST を 100 と決めたら、別の値で上書きすることはできません。
標準関数 defined( 定数名 ) を使って定数が既に定義済みでないか確認して下さい。


Fatal error: Cannot redeclare (関数名)

<?php
function test(){

}

function test(){

}

あるいは

<?php
function trim(){

}

同じ名前の関数が複数存在する場合に起こるエラーです。
上はユーザー定義関数が重複してしまっている場合で、
下はすでに PHP の標準関数として trim() というものがあるにもかかわらず、
同じ名前の関数を定義してしまっているケースです。
クラスにまとめておくのがベストですが、function_exists() を使って
同名の関数が既にないか調べておくのもひとつの手です。


include( ファイル名 ): failed to open stream: No such file or directory

<?php
include "test.php";

ファイルやディレクトリが存在しない場合に起こります。
include 以外にも、file_get_contents などでも同様のエラーになります。
include すると、相対パスのルートは読み込んだ側の場所になるので、
別のディレクトリにあるファイルを include する場合、相対パスの示す位置が変わるので、
dirname(__FILE__) を使って絶対パスに置き換えておくことで解決する場合もあります。


Deprecated: Function 関数名 is deprecated

<?php
$num = 3;
ereg("[0-9]", $num);
Deprecated: Function ereg() is deprecated

厳密にはエラーではないのですが、非推奨の関数を使っていると発生します。
PHP をバージョンアップすると、脆弱性や、新しい関数の登場によって、古い関数を使うべきではなくなることがあります。
例では ereg() は PHP 5.3.0 以降非推奨となった関数で、代わりに preg_match() を使うことが推奨されています。

すべて置き換えるべきですが、対応に時間がかかる場合は、php.ini を

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED

とするか、php ファイルに

error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);

を追加することで一時的にエラー表示を抑制します。
非推奨の関数には深刻な脆弱性がある場合がほとんどなので、あくまで対応までの時間稼ぎです。


次回に続きます


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です