PHP のエラーメッセージ

このページは、PHP のエラーメッセージの訳、エラーの発生理由、エラーの修正方法をまとめる予定のページです。

目次

注意

  • このページを作ったひとが記録のために記載しているため網羅性はありません。

一覧

Parse error: syntax error, unexpected '○○' (○○)

意訳

解析エラー: 文法エラー, 予期しない (コードの一部)

発生理由

実行するソースコードが PHP の文法にあっていません。

修正方法

  • ソースコードの間違いが無いか確認する
    • 例: スペルミス
    • 例: 半角スペースなどでの字下げの中に全角が混じっている

Warning: Use of undefined constant ○○ - assumed '○○' (this will throw an Error in a future version of PHP)

意訳

警告:未定義の定数 ○○ の使用 - '○○' (文字列) と仮定します (これはPHPの将来のバージョンではエラーを発生させます)

発生理由

使用しようとした定数が存在していません。

修正方法

  • 定数名のスペルミスが無いか確認する
  • 定数では無く、ただの文字列を使いたかった場合は '" で囲む (foo'foo')

Notice: Undefined index: ○○

意訳

通知: 未定義のインデックス: (キー名)

発生理由

配列に存在しないキーを指定して値を取り出そうとしています。
$_GET, $_POST, $_SESSION 等、「あると思っていたキーが実際には無かった」時によく発生します。

エラーが発生する例
$arr = [];
echo $arr['a']; // $arr に 'a' というキーは無いのに 'a' を指定している

修正方法

  • キーがあるか確認する
    • 例: isset() を使って if (isset($arr['a'])) echo $arr['a']; のようにキーがあるときだけ処理をする

Notice: session_start(): A session had already been started

意訳

通知: session_start(): セッションはすでに開始されています

発生理由

session_start() を2回以上実行しています。

修正方法

  • 複数 session_start() を実行している箇所が無いか確認し、不要な箇所は削除する
  • session_status() の戻り値が PHP_SESSION_ACTIVE か (セッションの状態がアクティブか) を事前にチェックし、PHP_SESSION_ACTIVE の時は session_start() しない

Fatal error: Uncaught Error: Call to undefined function ○○()

意訳

致命的なエラー: 未捕捉のエラー: 未定義の (関数)() の呼び出し

発生理由

呼び出した関数が存在していません。

修正方法

  • コードのスペルミスが無いか確認する
  • 使用したい関数が使用している PHP のバージョンに存在するか確認する
    • 例: mysql_connect() などの MySQL 関数は PHP 7 には存在しません
    • 例: split() は PHP 7 には存在しません

Warning: count(): Parameter must be an array or an object that implements Countable

意訳

警告: count(): パラメーターは Countable を実装する配列またはオブジェクトでなければなりません

発生理由

count() に与えた変数に null が入っているなど、count() できない値を count() に渡すと発生します。

修正方法

  • count() に渡す値が count() できる値なのか確認する
    • 例: is_array()is_countable() で事前にチェックする

Warning: mb_send_mail(): "sendmail_from" not set in php.ini or custom "From:" header missing

意訳

警告: mb_send_mail() php.iniで "sendmail_from" が設定されていないか、カスタムの "From:" ヘッダーがありません

発生理由

送信メールの From (差出人アドレス) にあたる箇所の指定が php.ini にもコードにも指定されていません。

修正方法

  • mb_send_mail() の4番目の引数に From を設定する (例 mb_send_mail($to, $subject, $message, 'From: test@example.com');)
  • php.inisendmail_from に From のメールアドレスを指定する

Warning: mb_send_mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()

意訳

警告: mb_send_mail(): "localhost" ポート 25 でメールサーバーに接続できませんでした。php.iniの "SMTP" および "smtp_port" 設定を確認するか、ini_set() を使用してください

発生理由

XAMPP などで、メールの送信サーバーの設定がされていないか誤っています。

修正方法

(XAMPP の場合の例)

  1. C:\xampp\php\php.ini 内に記載されている sendmail_pathsendmail_path = C:\xampp\sendmail\sendmail.exe に変更
  2. C:\xampp\sendmail\sendmail.ini に記載されている設定を変更 (主に下記)
    • smtp_server (送信サーバー名)
    • smtp_port (ポート)
    • auth_username (ユーザー名)
    • auth_password (パスワード)
  3. Apacheを再起動

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; ○○ has a deprecated constructor

意訳

非推奨: クラスと同じ名前のメソッドは PHP の将来のバージョンではコンストラクターではなくなります。 (クラス名) には非推奨のコンストラクタがあります

発生理由

昔の PHP ではクラスのコンストラクタはクラスと同名にすることになっていましたが、PHP 5 からは __construct という名前に変更になっており、PHP 7 ではクラスと同名のメソッドがあると非推奨エラーになります。

エラーが発生する例
class Test {
    Test() {
        // 昔のコンストラクタ記法
    }
}

修正方法

  • クラスと同名のメソッドの名前を __construct に変更する。コンストラクタでなければ別の名前にする