uwu

プログラミングの備忘録を書いています。誰かの為になれば幸いです

PHPでのエラー表示、デバックの仕方まとめ




PHPで勉強中、画面が真っ白!なんらかのエラーがあるのはわかるけど
エラーの内容がわからない。。なんて経験を思い出したのでまとめてみました。


ブラウザにエラーを表示する


.phpファイルに下記を追加すると手っ取り早くブラウザにエラーを表示できます。
ただしユーザーにもエラー内容が見えてしまうので使用するのは開発時のみにしてください。



<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
?>
ini_set()

この関数はphp.iniというPHPの設定に関するファイルを上書きします。
通常このファイルの場所は下記をPHPファイルに追加することでブラウザから確認できます。


phpinfo();

phpinfo()関数は現在使用しているPHPの情報をブラウザに表示します。
Configuration File (php.ini) PathとLoaded Configuration Fileに書かれているパスがphp.iniの場所になります。


display_errors

ブラウザにエラーを表示するかどうかの設定です。1で表示、0で非表示にできます。


display_startup_errors

PHPの起動時に発生したエラーを表示する設定です。1で表示、0で非表示にできます。


error_reporting

発生したエラーをどのレベルまで表示するかどうかの設定です。E_ALLにすることで全てのエラーを表示する設定にできます。
error_reporting(0);→すべてのエラーを表示しない


変数の中身をブラウザに表示する

期待された値が入ってこない。処理がどこまで走っているかわからない。そういう時はvar_dump()関数が便利です。
下記の関数を見たい変数の後に追記することでブラウザからその変数に何が入っているかを確認することができます。
変数の中身を知ることはPHPの理解を深めるのにとても役立つのでいっぱい使ってください。


var_dump($表示させたい変数名)
ログファイルにエラーを出力する

下記を追加することでエラーをログファイル(この場合php.log)に出力することができます。

ini_set('log_errors', 'On');
ini_set('error_log', 'php.log');

追記した後に作業中のディレクトリにphp.logファイルを作成しましょう。


log_errors

エラーログを出力するかどうかの設定です。Onで出力、Offで出力しない設定にできます。


error_log

エラーログを出力する場所の設定ができます。今回の場合プロジェクト上でphp.logというファイルを作成して
php.logという場所に出力する設定にしていますがパスを指定することで変更することができます。
エラーログの出力先の指定の他にもいろんな設定ができるので気になる方は↓をチェックしてみてください。



PHP: error_log - Manual



おまけ:エラー・デバックを表示させる関数

私がPHPを勉強していた時にやっていたエラーの表示、デバックの方法です!
作業しているディレクトリでphp.logファイルを作ることを忘れずに。
処理の流れが簡単に追えたり、SQLエラーを見るのに便利だったり非常に開発がはかどるので紹介します。



ini_set('log_errors', 'On');
ini_set('error_log', 'php.log');
//開発中のみtrue、それ以外はfalseにする
$debug_flg = true;
//デバッグログ用の関数
function debug($str)
{
  global $debug_flg;
  if ($debug_flg === true) {
    error_log('デバッグ:' . $str);
  } else {
    return false;
  }
}


使い方はこんな感じでなんらかの処理の後にdebug()に変数を入れてなにが入っているか確認したり。


  debug('SessionID:' . session_id());
  debug('SessionIDの配列の中身:' . print_r($_SESSION, true));

※もし配列の中身を表示したいときはprint_r($配列の変数名,true)にしないと見れません。



SQLもこんな感じで書けばエラーがあった時に出力してくれてわかりやすいです。


function userInfoAll($user_id)
{
  debug('userInfo関数を呼び出します');
  try {
    $dbh = dbConnect(); //これはDBに接続する為の自作関数です
    $sql = 'SELECT id, user_role, nickname, email, password, family_name, given_name, age, job, phone, zip, address, comment, pic, create_date, login_time, update_date FROM users WHERE id = :user_id AND delete_flg = 0';
    $data = array(
      ':user_id' => $user_id
    );
    $stmt = queryPost($dbh, $sql, $data);
    if ($stmt) {
      $stmt = $stmt->fetch(PDO::FETCH_ASSOC);
      return $stmt;
    } else {
      debug('クエリ失敗');
      debug('SQLエラー' . print_r($stmt->errorInfo(), true));
      return false;
    }
  } catch (Exception $e) {
    debug('userInfoAll関数でエラー発生:' . $e->getMessage());
  }
}