SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】PDOを拡張してログをとれるようにする

問題

PDOを使っていますが、実行したSQLのログを取りたいです。

答え

PDOを継承するとこんな感じで可能です。

<?php

class db extends PDO
{

	public $logs = array();

	function query($q)
	{
		$this->log($q);
		return parent::query($q);
	}

	function exec($q)
	{
		$this->log($q);
		return parent::exec($q);
	}

	function log($sql)
	{
		$this->logs[] = $sql;
	}
}

PDO::query() や PDO::exec() をオーバーライドして、ログ保存の処理を追加している。

上の例のように、ひとまず配列にSQLをため込んでもよいし、file_put_contents()などで、随時ファイルに保存してもよいでしょう。

ログの内容に、日時や実行結果(成功、失敗、エラー内容)などを残すこともできる。

プリペアドステートメントは、PDO::prepared()やPDO::execute()に渡された内容を取得することはできても、最終的に実行されたSQLは取得する方法がなさそう。

プリペアドステートメントのログも残すなら、PDO::prepared()やPDO::execute()が呼ばれた時の引数を保存しておくぐらいまでが簡単。

関連するメモ

コメント