先日、PDOを使ってDBへ書き込むプログラムを触っていたのだが、特定の条件(原因不明)において正常に書き込みがされない問題が発生した。

しばらくソースコードを見直してみたが結局原因が分からなかったため、エラーログを取ることにした。

今回はPDOを使ったDB書き込み処理時に、例外エラーが発生した場合にテキストファイルへログを書き込む処理を入れる方法を紹介する。

まず、PDOのインスタンス生成時に以下のコードを追加する。
※これがないとtry〜catch文で例外を投げることができない。

$db = new PDO($dsn, DB_USER, DB_PASS);

// 以下を追加
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

続いて、例外発生時にエラーログを取る処理を書いていく。

try {
  // Code...
} catch(PDOException $e) {
  $log = __DIR__.'/error.log';
  $logTime = date('Y-m-d H:i:s');
  error_log('['.$logTime.'] '.$e->getMessage().PHP_EOL, 3, $log);

  die();
}

4行目以降が該当の処理。

error_log関数を使ってログの出力をおこなっている。
この関数について軽く解説しておこう。

error_log関数は第一引数に書き込む内容を、第二引数にログタイプを指定する。

ログタイプに「3」を指定すると、第三引数で指定したファイルにログを書き込むことができる。

なお、4行目の$log変数に格納したファイルパスは、error_log実行時にファイルが実在しないとエラーが発生してしまうため、あらかじめ用意しておく必要があるので注意が必要だ。